<<silently>>
<<set _legacyArtMode = String($age1WorldGenLegacyArtMode ?? "")>>
<<if _legacyArtMode isnot "legacy_new" and _legacyArtMode isnot "new_only">>
<<set $age1WorldGenLegacyArtMode = "legacy_new">>
<</if>>
<<if setup.difficulty and setup.difficulty.getId>>
<<set _difficulty = setup.difficulty.getId()>>
<<else>>
<<set _difficulty = String($age1WorldGenDifficulty ?? "godling")>>
<<if _difficulty is "easy">><<set _difficulty = "god">><<elseif _difficulty is "normal">><<set _difficulty = "godling">><<elseif _difficulty is "difficult" or _difficulty is "hard">><<set _difficulty = "mortal">><</if>>
<<if _difficulty isnot "god" and _difficulty isnot "godling" and _difficulty isnot "mortal">><<set _difficulty = "godling">><</if>>
<<set $age1WorldGenDifficulty = _difficulty>>
<</if>>
<</silently>>
<div class="worldgen-shell worldgen-shell--locked">
<div class="worldgen-kicker">Age 1 World Generation</div>
<h1 class="worldgen-title">Shape The Land</h1>
<p class="worldgen-copy">Choose the world conditions for the first age.</p>
<div class="worldgen-grid">
<section class="worldgen-group">
<div class="worldgen-group-head">
<h2 class="worldgen-group-title">Difficulty</h2>
</div>
<div class="worldgen-options">
<<if _difficulty is "god">><span class="worldgen-choice is-selected"><<button "God" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "god">><</button>><span class="worldgen-tooltip"><strong>God</strong><span>A more forgiving experience focused on power, exploration, and shaping your legend.</span><span>+40% passive Food</span><span>+30% passive Resources</span><span>+25% population Belief</span><span>40% slower depletion pressure</span><span>More forgiving defensive raids</span><span>The Mishan war will be more forgiving.</span></span></span><<else>><span class="worldgen-choice"><<button "God" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "god">><</button>><span class="worldgen-tooltip"><strong>God</strong><span>A more forgiving experience focused on power, exploration, and shaping your legend.</span><span>+40% passive Food</span><span>+30% passive Resources</span><span>+25% population Belief</span><span>40% slower depletion pressure</span><span>More forgiving defensive raids</span><span>The Mishan war will be more forgiving.</span></span></span><</if>>
<<if _difficulty is "godling">><span class="worldgen-choice is-selected"><<button "Godling" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "godling">><</button>><span class="worldgen-tooltip"><strong>Godling</strong><span>The intended management experience.</span><span>Growth, migration, administration, and careful use of the land all matter.</span></span></span><<else>><span class="worldgen-choice"><<button "Godling" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "godling">><</button>><span class="worldgen-tooltip"><strong>Godling</strong><span>The intended management experience.</span><span>Growth, migration, administration, and careful use of the land all matter.</span></span></span><</if>>
<<if _difficulty is "mortal">><span class="worldgen-choice is-selected"><<button "Mortal" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "mortal">><</button>><span class="worldgen-tooltip"><strong>Mortal</strong><span>A harsher struggle where careful management matters and cruel seasons can become true survival crises.</span><span>-25% passive Resources</span><span>-10% population Belief</span><span>+25% bad seasonal Food penalty severity</span><span>More dangerous defensive raids</span><span>The Mishan war will be less forgiving.</span></span></span><<else>><span class="worldgen-choice"><<button "Mortal" "Age1_World_Gen">><<set $age1WorldGenDifficulty = "mortal">><</button>><span class="worldgen-tooltip"><strong>Mortal</strong><span>A harsher struggle where careful management matters and cruel seasons can become true survival crises.</span><span>-25% passive Resources</span><span>-10% population Belief</span><span>+25% bad seasonal Food penalty severity</span><span>More dangerous defensive raids</span><span>The Mishan war will be less forgiving.</span></span></span><</if>>
</div>
</section>
<section class="worldgen-group">
<div class="worldgen-group-head">
<h2 class="worldgen-group-title">Legacy Art</h2>
</div>
<div class="worldgen-options worldgen-options--two">
<<if $age1WorldGenLegacyArtMode is "legacy_new">><span class="worldgen-choice is-selected"><<button "Legacy+New" "Age1_World_Gen">><<set $age1WorldGenLegacyArtMode = "legacy_new">><<run (settings.legacyArtEnabled = true, typeof Setting !== "undefined" && typeof Setting.save === "function" ? Setting.save() : null)>><</button>></span><<else>><span class="worldgen-choice"><<button "Legacy+New" "Age1_World_Gen">><<set $age1WorldGenLegacyArtMode = "legacy_new">><<run (settings.legacyArtEnabled = true, typeof Setting !== "undefined" && typeof Setting.save === "function" ? Setting.save() : null)>><</button>></span><</if>>
<<if $age1WorldGenLegacyArtMode is "new_only">><span class="worldgen-choice is-selected"><<button "New Only" "Age1_World_Gen">><<set $age1WorldGenLegacyArtMode = "new_only">><<run (settings.legacyArtEnabled = false, typeof Setting !== "undefined" && typeof Setting.save === "function" ? Setting.save() : null)>><</button>></span><<else>><span class="worldgen-choice"><<button "New Only" "Age1_World_Gen">><<set $age1WorldGenLegacyArtMode = "new_only">><<run (settings.legacyArtEnabled = false, typeof Setting !== "undefined" && typeof Setting.save === "function" ? Setting.save() : null)>><</button>></span><</if>>
</div>
</section>
<section class="worldgen-group">
<div class="worldgen-group-head">
<h2 class="worldgen-group-title">World Bounty</h2>
</div>
<div class="worldgen-options">
<span class="worldgen-option is-disabled worldgen-option--patron">Scarce<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
<span class="worldgen-option is-selected is-disabled worldgen-option--patron">Decent<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
<span class="worldgen-option is-disabled worldgen-option--patron">Plentiful<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
</div>
</section>
<section class="worldgen-group">
<div class="worldgen-group-head">
<h2 class="worldgen-group-title">Inhabitants</h2>
</div>
<div class="worldgen-options worldgen-options--four">
<span class="worldgen-option is-disabled worldgen-option--patron">2 Tribes<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
<span class="worldgen-option is-disabled worldgen-option--patron">3 Tribes<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
<span class="worldgen-option is-selected is-disabled worldgen-option--patron">4 Tribes<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
<span class="worldgen-option is-disabled worldgen-option--patron">5 Tribes<span class="worldgen-tooltip"><strong>Advanced World Shaping</strong><span>Unlocked in the Tier 4 Patron Build</span></span></span>
</div>
</section>
</div>
<div class="worldgen-actions">
<<button "Begin Age 1">><<if setup.difficulty and setup.difficulty.getId>><<run setup.difficulty.getId()>><</if>><<if $age1WorldGenLegacyArtMode is "new_only">><<run settings.legacyArtEnabled = false>><<else>><<run settings.legacyArtEnabled = true>><</if>><<goto "START">><</button>>
</div>
</div><div class="system-notice-screen">
<section class="system-notice-shell" aria-labelledby="age-check-title">
<div class="system-kicker">Content Notice</div>
<h1 class="system-notice-title" id="age-check-title">Before You Begin</h1>
<p class="system-notice-copy">
This game may contain <b>mature themes</b> (violence, harsh survival, and adult subject matter). To continue, you must confirm that you are <b>18 years of age or older</b>.
</p>
<div class="system-notice-callout">
<b>All characters depicted in sexual content are 18+.</b>
</div>
<p class="system-notice-copy">
By selecting “Yes”, you confirm you are at least 18.
</p>
<div class="system-notice-actions">
<<button "Yes (I am 18+)">>
<<if setup.worldGen and setup.worldGen.tier4Enabled and Story.has("Age1_World_Gen_Tier4")>>
<<goto "Age1_World_Gen_Tier4">>
<<else>>
<<goto "Age1_World_Gen">>
<</if>>
<</button>>
<<button "No (Take me back)">>
<<goto "Main_Menu">>
<</button>>
</div>
<p class="system-notice-note">
If you are under 18, please do not proceed.
</p>
</section>
</div>''<div class="intro-creation no-click-sfx intro-void-story">
Yes. That is your name.
It settles into place before the rest of you does. Familiar. Foreign. Around it, the vessel sharpens: skin, hair, eyes, hands that almost feel like your own when you try to move them.
There is no mirror in this place that has been your home since your first breath, but you know the shape is yours. Or it will be.
The silence starts becoming louder.
Pieces are still missing. You can feel the gaps where memory should be, wide and cold, but something remains beneath them: a pull, a purpose, a reason you were made.
One question rises before all others.
<<button "What are you?">>
<<goto "What are you?">>
<</button>>
</div>''<<silently>>
<<if setup.campNpcs and setup.campNpcs.ensureState>><<run setup.campNpcs.ensureState()>><</if>>
<<if setup.people and setup.people.syncCampNpcsToPeople>><<run setup.people.syncCampNpcsToPeople()>><</if>>
<<if setup.campPositions and setup.campPositions.ensureState>><<run setup.campPositions.ensureState()>><</if>>
<<set _pid = $activePersonId ?? $personInfoId ?? $selectedPersonId ?? $personSelectedId>>
<<set _npc = (setup.campPositions and setup.campPositions.getNpcById) ? setup.campPositions.getNpcById(_pid) : null>>
<<if !_npc>><<goto "Interact">><</if>>
<<set _name = _npc.name ?? "Camp follower">>
<<set _currentPosId = (setup.campPositions and setup.campPositions.getNpcPositionId) ? setup.campPositions.getNpcPositionId(_pid) : "">>
<<set _currentLabel = _currentPosId ? setup.campPositions.getNpcPositionLabel(_pid) : "None">>
<<set _displayGroups = (setup.campPositions and setup.campPositions.getAssignmentDisplayGroups) ? setup.campPositions.getAssignmentDisplayGroups() : []>>
<<set $campPositionAssignmentCollapsed = $campPositionAssignmentCollapsed ?? {}>>
<<set _assignmentNotice = ($lastCampPositionAssignmentResult and String($lastCampPositionAssignmentResult.npcId ?? "") is String(_pid ?? "")) ? $lastCampPositionAssignmentResult : null>>
<</silently>>
<div class="campassign-wrap">
<div class="camp-positions-head">
<div>
<div class="camp-positions-kicker">Camp Position Assignment</div>
<div class="camp-positions-title-row">
<div class="camp-positions-title"><<print _name>></div>
<div class="camp-position-actions">
<<capture _pid>><<button "Return">><<set $activePersonId = _pid>><<set $personInfoId = _pid>><<if $campPositionAssignmentReturn is "Person_Info">><<goto "Person_Info">><<elseif $campPositionAssignmentReturn is "Talk_1">><<set $npcTalkOutput = "">><<goto "Talk_1">><<else>><<set $randomNpcInteractTab = "judgment">><<goto "Random_NPC_Interact">><</if>><</button>><</capture>>
</div>
</div>
<div class="camp-positions-sub">Current position: <strong><<print _currentLabel>></strong></div>
</div>
</div>
<<if _assignmentNotice>>
<<print (setup.relationships and setup.relationships.renderCampPositionAssignmentNotice) ? setup.relationships.renderCampPositionAssignmentNotice(_assignmentNotice) : "">>
<<set $lastCampPositionAssignmentResult = null>>
<</if>>
<div class="camp-position-card-list">
<<if _displayGroups.length>>
<<for _gi = 0; _gi < _displayGroups.length; _gi++>>
<<set _group = _displayGroups[_gi]>>
<<set _groupId = _group.id>>
<<set _isCollapsed = !!$campPositionAssignmentCollapsed[_groupId]>>
<section @class="_isCollapsed ? 'camp-position-category is-collapsed' : 'camp-position-category'">
<div class="camp-position-category-head">
<div class="camp-position-category-title"><<print _group.label>></div>
<div class="camp-position-category-count"><<print _group.positions.length>> position<<if _group.positions.length isnot 1>>s<</if>></div>
<div class="camp-position-collapse"><<capture _groupId _isCollapsed>><<if _isCollapsed>><<button "+" "Camp_Position_Assignment">><<set $campPositionAssignmentCollapsed[_groupId] = false>><</button>><<else>><<button "-" "Camp_Position_Assignment">><<set $campPositionAssignmentCollapsed[_groupId] = true>><</button>><</if>><</capture>></div>
</div>
<div @class="_group.id is 'leadership' ? 'camp-position-category-grid camp-position-category-grid--leadership' : 'camp-position-category-grid'">
<<for _pi = 0; _pi < _group.positions.length; _pi++>>
<<set _posId = _group.positions[_pi]>>
<<set _def = setup.campPositions.getDef(_posId)>>
<<set _status = setup.campPositions.getStatus(_posId, { preview: true })>>
<<set _capacity = setup.campPositions.getPositionCapacity(_posId)>>
<<set _holderCount = setup.campPositions.getPositionHolderCount(_posId)>>
<<set _holderNames = setup.campPositions.getPositionHolderNames(_posId)>>
<<set _holderLabel = _holderCount <= 0 ? "None assigned" : (_holderCount is 1 ? _holderNames : (_holderCount + " assigned"))>>
<<set _elig = setup.campPositions.checkEligibility(_posId, _npc)>>
<<set _isCurrent = _currentPosId is _posId>>
<<set _candidateAptitude = setup.campPositions.getAptitude(_posId, _npc)>>
<<set _displayEffectLabel = (_isCurrent and _posId is "concubine") ? setup.campPositions.buildEffectLabel(_def, setup.campPositions.makeActiveEffects(_def, _candidateAptitude, _status.active), _status.active) : _status.effectLabel>>
<<set _upkeepLabel = setup.campPositions.formatUpkeep(_posId)>>
<<if String(_upkeepLabel).toLowerCase() is "none">><<set _upkeepLabel = "No upkeep">><</if>>
<<set _restrictionText = _status.restrictionLabel ?? setup.campPositions.getRestrictionText(_posId)>>
<<set _restrictionKind = setup.campPositions.getRestrictionDisplayKind(_posId, _restrictionText)>>
<<set _assignBlockedReason = _currentPosId and !_isCurrent ? ("Already assigned to " + _currentLabel + ". Remove that position before assigning another.") : (_elig.reason ?? "Unavailable")>>
<<if _def>>
<<set _cardClass = "camp-position-card">>
<<if _posId is "second">><<set _cardClass += " camp-position-featured">><</if>>
<<if _isCurrent>><<set _cardClass += " is-current">><</if>>
<<if _currentPosId and !_isCurrent>><<set _cardClass += " is-ineligible">><</if>>
<div @class="_cardClass">
<div class="camp-position-card-main">
<div class="camp-position-name camp-position-has-tip" tabindex="0"><<print _def.name>><span class="camp-position-tip-ico" aria-hidden="true">i</span><span class="camp-position-tipbox" role="tooltip"><span class="camp-position-tip-desc"><<print _def.description>></span><<set _relevantStats = setup.campPositions.getRelevantStatsLabel(_posId)>><<if _relevantStats>><span class="camp-position-tip-stats"><<print _relevantStats>></span><</if>><<if _def.effectText>><span class="camp-position-tip-eff"><<print _def.effectText>></span><</if>></span></div>
<div @class="setup.campPositions.getAptitudeBadgeClass(_candidateAptitude)" tabindex="0"><<print _candidateAptitude.label>><span class="camp-position-apt-ico" aria-hidden="true">i</span><span class="camp-position-aptbox" role="tooltip"><<print setup.campPositions.renderAptitudeTierTooltip(_posId)>></span></div>
</div>
<div class="camp-position-status-line">
<div class="camp-position-holder" @title="_holderNames"><<print _holderLabel>></div>
<div class="camp-position-capacity"><<print _holderCount>> / <<print _capacity>></div>
</div>
<div class="camp-position-effect"><<print _displayEffectLabel>></div>
<<if _restrictionKind>>
<div @class="_restrictionKind is 'requirement' ? 'camp-position-restriction-note is-requirement' : 'camp-position-restriction-note'"><<print _restrictionText>></div>
<</if>>
<div class="camp-position-footer">
<div class="camp-position-upkeep"><<print _upkeepLabel>></div>
<div class="camp-position-actions">
<<capture _posId _pid _isCurrent _elig _assignBlockedReason _currentPosId>>
<<if _isCurrent>>
<<button "Remove">><<run setup.campPositions.unassignByPlayer(_posId, _pid)>><<goto "Camp_Position_Assignment">><</button>>
<<elseif !_currentPosId and _elig.ok>>
<<button "Assign">><<run setup.campPositions.assign(_posId, _pid)>><<goto "Camp_Position_Assignment">><</button>>
<<else>>
<span class="camp-position-disabled camp-position-disabled--tip" @data-assign-tip="_assignBlockedReason" aria-disabled="true" tabindex="0">Assign</span>
<</if>>
<</capture>>
</div>
</div>
</div>
<</if>>
<</for>>
</div>
</section>
<</for>>
<<else>>
<div class="interact-modern-empty">
<strong>No positions known</strong>
<span>No camp positions are currently available.</span>
</div>
<</if>>
</div>
</div><<nobr>>
<<run setup.campStructures.ensureState()>>
<<print setup.campStructures.render()>>
<<done>><<run setup.campStructures.mount()>><</done>>
<</nobr>><<nobr>>
<<run setup.aspects && setup.aspects.ensureState ? setup.aspects.ensureState() : null>>
<<set _charTab = ["character", "powers", "aspect"].includes(String($characterPanelTab ?? "character")) ? String($characterPanelTab ?? "character") : "character">>
<<if _charTab is "aspect">>
<div class="character-layout character-layout--aspect">
<div class="character-panel character-aspect-stats-spacer"></div>
<div class="character-panel character-main-panel">
<<characterTabs>>
<div class="character-tab-content character-tab-content--aspect">
<<aspectPanel>>
<<if $debug>>
<<button "Debug: Increase All Aspect Levels">>
<<run setup.aspects.debugRaiseAllOneLevel()>>
<<goto "Character">>
<</button>>
<</if>>
</div>
<div class="char-return">
<<return>>
</div>
</div></div>
<<elseif _charTab is "powers">>
<div class="character-layout character-layout--powers">
<div class="character-panel character-powers-spacer"></div>
<div class="character-panel character-main-panel">
<<characterTabs>>
<div class="character-tab-content character-tab-content--powers">
<div class="character-powers-grid">
<div class="character-panel character-powers-stats-panel">
<div class="char-panel-head char-panel-head--stats">
<h2 class="char-panel-title">STATS</h2>
<<characterPowerBadge>>
</div>
<<characterStatPanel>>
</div>
<div class="character-panel character-powers-body">
<h2>POWERS</h2>
<<powerGrid>>
</div>
</div>
</div>
<div class="char-return">
<<return>>
</div>
</div></div>
<<else>>
<div class="character-layout character-layout--identity">
<div class="character-panel character-identity-spacer"></div>
<div class="character-panel character-main-panel">
<<characterTabs>>
<div class="character-tab-content character-tab-content--identity">
<<characterIdentityPanel>>
</div>
<div class="char-return">
<<return>>
</div>
</div></div>
<</if>>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<if !$clash or (!$clash.active and !$clash.result)>><<run setup.clashV1.startDebug()>><</if>>
<<run setup.clashV1.playBattleMusic()>>
<<print setup.clashV1.render()>>
<<if $clash && $clash.phase === "resolving">>
<<script>>
if (setup.clashV1 && setup.clashV1.scheduleAdvance) {
setup.clashV1.scheduleAdvance();
}
<</script>>
<</if>>
<<if $clash && $clash.result === "victory_sequence">>
<<script>>
if (setup.clashV1 && setup.clashV1.scheduleVictorySequence) {
setup.clashV1.scheduleVictorySequence();
}
<</script>>
<</if>>
<div class="clashv1-control-panel" data-clash-cat="basic">
<div class="clashv1-control-inner">
<div class="clashv1-cat-tabs">
<button type="button" class="clashv1-cat-tab is-active" data-clash-cat-btn="basic">Basic</button>
<button type="button" class="clashv1-cat-tab" data-clash-cat-btn="movement">Move</button>
<button type="button" class="clashv1-cat-tab" data-clash-cat-btn="tactics">Tactics</button>
<button type="button" class="clashv1-cat-tab" data-clash-cat-btn="powers">Powers</button>
</div>
<div class="clashv1-actiongroup clashv1-group-basic">
<div class="clashv1-actions">
<<if setup.clashV1.canAct("light_attack")>>
<<button "Light Attack">>
<<run setup.clashV1.perform("light_attack")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Light Attack</span>
<</if>>
<<if setup.clashV1.canAct("heavy_attack")>>
<<button "Heavy Attack">>
<<run setup.clashV1.perform("heavy_attack")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Heavy Attack</span>
<</if>>
<<if setup.clashV1.canAct("defend")>>
<<button "Defend">>
<<run setup.clashV1.perform("defend")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Defend</span>
<</if>>
<<if setup.clashV1.canAct("counter")>>
<<button "Counter">>
<<run setup.clashV1.perform("counter")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Counter</span>
<</if>>
</div>
</div>
<div class="clashv1-actiongroup clashv1-group-movement">
<div class="clashv1-actions">
<<if setup.clashV1.canAct("shift_in")>>
<<button "Forward">>
<<run setup.clashV1.perform("shift_in")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Forward</span>
<</if>>
<<if setup.clashV1.canAct("shift_out")>>
<<button "Backward">>
<<run setup.clashV1.perform("shift_out")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Backward</span>
<</if>>
</div>
</div>
<div class="clashv1-actiongroup clashv1-group-tactics">
<div class="clashv1-actions">
<<if setup.clashV1.canAct("focus")>>
<<button "Focus">>
<<run setup.clashV1.perform("focus")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Focus</span>
<</if>>
<<if setup.clashV1.canAct("read_intent")>>
<<button "Read Intent">>
<<run setup.clashV1.perform("read_intent")>>
<<goto "Clash_V1_Battle">>
<</button>>
<<else>>
<span class="clashv1-disabled">Read Intent</span>
<</if>>
</div>
</div>
<div class="clashv1-actiongroup clashv1-group-powers">
<div class="clashv1-actions">
<<if setup.clashV1.hasPowerAction("mend_wounds")>>
<<if setup.clashV1.canAct("mend_wounds")>>
<<button "Mend Wound">>
<<run setup.clashV1.perform("mend_wounds")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Mend Wound</span>
<</if>>
<</if>>
<<if setup.clashV1.hasPowerAction("spark")>>
<<if setup.clashV1.canAct("spark")>>
<<button "Spark">>
<<run setup.clashV1.perform("spark")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Spark</span>
<</if>>
<</if>>
<<if setup.clashV1.hasPowerAction("foresight")>>
<<if setup.clashV1.canAct("foresight")>>
<<button "Foresight">>
<<run setup.clashV1.useForesightWithEffect()>>
<</button>>
<<else>>
<span class="clashv1-disabled">Foresight</span>
<</if>>
<</if>>
<<if !setup.clashV1.hasPowerAction("mend_wounds") and !setup.clashV1.hasPowerAction("spark") and !setup.clashV1.hasPowerAction("foresight")>>
<div class="clashv1-powers-empty">No powers yet. Acquire combat-ready powers to use them here.</div>
<</if>>
</div>
</div>
</div>
<div class="clashv1-control-footer">
<div class="clashv1-footer-actions">
<<if setup.clashV1.canAct("clear_queue")>>
<<button "Clear Queue">>
<<run setup.clashV1.perform("clear_queue")>>
<<goto "Clash_V1_Battle">>
<</button>>
<<else>>
<span class="clashv1-disabled">Clear Queue</span>
<</if>>
<<if setup.clashV1.canAct("end_turn")>>
<<button "Resolve Turn">>
<<run setup.clashV1.perform("end_turn")>>
<<if $clash.result is "win">><<goto "Clash_V1_Win">><<elseif $clash.result is "loss">><<goto "Clash_V1_Loss">><<else>><<goto "Clash_V1_Battle">><</if>>
<</button>>
<<else>>
<span class="clashv1-disabled">Resolve Turn</span>
<</if>>
</div>
</div>
</div><<if $clash and $clash.mode is "unfinished_pilgrimage">><<goto "Event_Major_UnfinishedPilgrimage_Defeat">><</if>>
<<run setup.clashV1.stopBattleMusic()>>
''<div class="hub-textbox">
<<if $clash and $clash.mode is "unfinished_pilgrimage">>
The Shadow Entity remains standing in the false street.
The pilgrimage ends without arrival.
<<else>>
The ring of watching faces blurs. The challenger stands over you, breathing hard.
This first Clash prototype records the duel as a defeat.
<</if>>
<<if $clash>>Final state: the challenger had <<print $clash.enemy.hp>> / <<print $clash.enemy.maxHp>> HP remaining.<</if>>
<div class="hub-buttons">
<<button "Return to Camp">><<if $clash and $clash.returnPassageLoss>><<goto $clash.returnPassageLoss>><<else>><<goto "Hub_1">><</if>><</button>>
</div>
</div><<run setup.clashV1.stopBattleMusic()>>
''<div class="hub-textbox">
<<if $clash and $clash.mode is "unfinished_pilgrimage">>
The Shadow Entity breaks apart like a memory losing its last witness.
The unfinished road fades from beneath your feet.
<<else>>
The challenger drops to one knee and yields.
This first Clash prototype records the duel as a victory.
<</if>>
<<if $clash>>Final state: you had <<print $clash.player.hp>> / <<print $clash.player.maxHp>> HP remaining.<</if>>
<div class="hub-buttons">
<<button "Return to Camp">><<if $clash and $clash.returnPassageWin>><<goto $clash.returnPassageWin>><<else>><<goto "Hub_1">><</if>><</button>>
</div>
</div><<nobr>>
<<craftEnsure>>
<div class="craftui-root">
<div class="crafting-layout">
<!-- LEFT: recipe list -->
<div class="craft-panel craft-left">
<h2>CRAFTING</h2>
<div class="craft-hint">Pick a recipe on the left. Required terrain blocks crafting; preferred terrain lowers ingredient costs.</div>
<div id="craft-recipe-list"><<craftRecipeFilters>><<craftRecipeList>></div>
</div>
<!-- RIGHT: workbench -->
<div class="craft-panel craft-right">
<div id="craft-workbench">
<<craftDetailPanel>>
</div>
</div>
</div>
</div>
<</nobr>><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_dispute") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _a = _data.tribeAName ?? "one member tribe">>
<<set _b = _data.tribeBName ?? "another member tribe">>
<<set _sideA = "Side with " + _a>>
<<set _sideB = "Side with " + _b>>
<<if _entry and !_entry.federationDisputeState>><<set _entry.federationDisputeState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Federation Dispute</h2>
<p>Speakers from <b><<print _a>></b> and <b><<print _b>></b> arrive at your camp with the same argument told in two different shapes. Neither camp wants blood, but both want the issue resolved.</p>
<p>They ask you, $user, and your tribe to mediate. Whatever you decidem the decision will travel through the federation before the next dawn.</p>
</div>''
<div class="hub-buttons">
<<button _sideA>>
<<if $currentEvent>><<set $currentEvent.federationDisputeState.choice = "a">><<goto "Event_Federation_Dispute_Resolve">><</if>>
<</button>>
<<button _sideB>>
<<if $currentEvent>><<set $currentEvent.federationDisputeState.choice = "b">><<goto "Event_Federation_Dispute_Resolve">><</if>>
<</button>>
<<button "Side with no one">>
<<if $currentEvent>><<set $currentEvent.federationDisputeState.choice = "none">><<goto "Event_Federation_Dispute_Resolve">><</if>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_dispute") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.federationDisputeState) ? (_entry.federationDisputeState.choice ?? "none") : "none">>
<<if _entry and !_entry.federationDisputeResult>><<run setup.federation.resolveDisputeChoice(_choice)>><</if>>
<<set _r = _entry ? _entry.federationDisputeResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _a = _data.tribeAName ?? "Tribe A">>
<<set _b = _data.tribeBName ?? "Tribe B">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Judgment Given</h2>
<p>You dont hesitate for long before giving your verdict. From one side you hear satisfied sneers, from the other swears, curses and insults, that they think you don't understand. Good. Keep it that way for now.</p>
<<if _r>>
<<if _r.choice is "a">>
<p>You name <b><<print _a>></b> as the wronged camp. Their speakers leave with chins high, while <b><<print _b>></b> carries the insult home in clenched teeth.</p>
<<elseif _r.choice is "b">>
<p>You name <b><<print _b>></b> as the wronged camp. Their speakers leave with chins high, while <b><<print _a>></b> carries the insult home in clenched teeth.</p>
<<else>>
<p>You refuse to give either fire the victory they wanted. Both camps leave dissatisfied, but neither can claim you bent the oath for the other.</p>
<</if>>
<div class="result-list">
<<for _i = 0; _i < _r.changes.length; _i++>>
<<set _c = _r.changes[_i]>>
<div class="result-line <<if _c.delta >= 0>>good<<else>>bad<</if>>">
<span class="label"><<print _c.tribeName>></span>
<span class="value"><<if _c.delta >= 0>>+<</if>><<print _c.delta>> relations (<<print _c.before>> -> <<print _c.after>>)</span>
</div>
<</for>>
</div>
<<else>>
<p>The dispute slips away unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the matter rest.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_friend_need") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _name = _data.tribeName ?? "a federation member">>
<<set _key = _data.resourceKey ?? "food">>
<<set _label = _data.resourceLabel ?? _key>>
<<set _amount = Number(_data.amount ?? 0)>>
<<set _have = Number(State.variables[_key] ?? 0)>>
<<set _canHelp = _have >= _amount>>
<<if _entry and !_entry.federationNeedState>><<set _entry.federationNeedState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>A Friend In Need</h2>
<p>Messengers from <b><<print _name>></b> come tired and careful. Their stores are thin, and they ask you for help before hunger or want turns into starvation.</p>
<div class="result-list">
<div class="result-line"><span class="label">Request</span><span class="value"><<print _amount>> <<print _label>></span></div>
<div class="result-line"><span class="label">You have</span><span class="value"><<print _have>></span></div>
</div>
</div>''
<div class="hub-buttons">
<<if _canHelp>>
<<button "Help them">>
<<if $currentEvent>><<set $currentEvent.federationNeedState.choice = "help">><<goto "Event_Federation_FriendNeed_Resolve">><</if>>
<</button>>
<<else>>
<span class="macro-button disabled" title="You do not have enough to send this aid.">Help them</span>
<</if>>
<<button "Refuse">>
<<if $currentEvent>><<set $currentEvent.federationNeedState.choice = "refuse">><<goto "Event_Federation_FriendNeed_Resolve">><</if>>
<</button>>
<<button "Find another answer (Wisdom DC 15)">>
<<if $currentEvent>><<set $currentEvent.federationNeedState.choice = "wisdom">><<goto "Event_Federation_FriendNeed_Resolve">><</if>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_friend_need") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.federationNeedState) ? (_entry.federationNeedState.choice ?? "refuse") : "refuse">>
<<if _entry and !_entry.federationNeedResult>><<run setup.federation.resolveFriendNeedChoice(_choice)>><</if>>
<<set _r = _entry ? _entry.federationNeedResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _name = _data.tribeName ?? "a federation member">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>They Don't Stand Alone</h2>
<<if _r>>
<<if _r.choice is "help">>
<p>You send the requested <<print _r.resourceLabel>> without making <b><<print _name>></b> beg twice. Their messengers leave lighter, and the shared oath feels a little more real for being costly.</p>
<<elseif _r.choice is "wisdom" and _r.success>>
<p>You find a leaner answer in shared routes, delayed repayment, and careful rationing. <b><<print _name>></b> accepts the plan, if not with full joy.</p>
<<elseif _r.choice is "wisdom">>
<p>Your answer sounds clever at first, then hollow. <b><<print _name>></b> returns home feeling abandoned and talked down to.</p>
<<else>>
<p>You refuse the request. <b><<print _name>></b> keeps their dignity, but the shared oath feels thinner for it.</p>
<</if>>
<div class="result-list">
<<if _r.choice is "wisdom">>
<<if _r.success>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print _r.total>> / 15</span>
</div>
<</if>>
<<if _r.choice is "help">>
<div class="result-line bad">
<span class="label">Cost</span>
<span class="value">-<<print _r.amount>> <<print _r.resourceLabel>></span>
</div>
<</if>>
<<if _r.relation>>
<div class="result-line <<if _r.relation.delta >= 0>>good<<else>>bad<</if>>">
<span class="label"><<print _r.relation.tribeName>></span>
<span class="value"><<if _r.relation.delta >= 0>>+<</if>><<print _r.relation.delta>> relations (<<print _r.relation.before>> -> <<print _r.relation.after>>)</span>
</div>
<</if>>
<<if _r.cohesion>>
<div class="result-line bad">
<span class="label">Cohesion</span>
<span class="value"><<print _r.cohesion.before>> -> <<print _r.cohesion.after>></span>
</div>
<</if>>
</div>
<<else>>
<p>The request passes unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Send them home with your answer.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_good_relations") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<if _entry and !_entry.federationGoodRelationsResult>><<run setup.federation.resolveGoodRelationsGift()>><</if>>
<<set _r = _entry ? _entry.federationGoodRelationsResult : null>>
<<set _name = _r ? _r.tribeName : "a federation member">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Good Relations With <<print _name>></h2>
<<if _r>>
<p>Emissaries from <b><<print _r.tribeName>></b> arrive at your camp bearing gifts. You make sure they are properly hosted, fed, and heard before the fire.</p>
<p>By the time they leave, the gift has become more than goods changing hands. It is a public reminder that the federation oath can feel like kinship when relations are warm enough to carry it.</p>
<div class="result-list">
<div class="result-line good"><span class="label">Your <<print _r.giftLabel>></span><span class="value">+<<print _r.giftAmount>> (<<print _r.beforePlayer>> -> <<print _r.afterPlayer>>)</span></div>
<div class="result-line bad"><span class="label"><<print _r.tribeName>> resources</span><span class="value">-<<print _r.tribeResourceCost>> (<<print _r.beforeTribeResources>> -> <<print _r.afterTribeResources>>)</span></div>
<div class="result-line"><span class="label">Relations</span><span class="value"><<print _r.relations>></span></div>
<div class="result-line"><span class="label">Cohesion equilibrium</span><span class="value"><<print _r.cohesionEquilibrium>></span></div>
</div>
<<else>>
<p>The emissaries never reach the fire.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "See the emissaries off.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_plea_for_aid") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _member = _data.memberName ?? "a federation member">>
<<set _attacker = _data.attackerName ?? "a hostile tribe">>
<<set _dist = Number(_data.distanceToPlayer ?? 99)>>
<<if _entry and !_entry.federationPleaState>><<set _entry.federationPleaState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Plea For Aid</h2>
<p>Runners from <b><<print _member>></b> reach your camp breathless and dust-streaked. Scouts have seen warbands from <b><<print _attacker>></b> moving toward their camp.</p>
<p>They are close enough that you and your warriors could make it in time. If you answer, your tribe will fight beside them before the raiders can have their way with your ally.</p>
<div class="result-list">
<div class="result-line"><span class="label">Ally</span><span class="value"><<print _member>></span></div>
<div class="result-line"><span class="label">Threat</span><span class="value"><<print _attacker>></span></div>
<div class="result-line"><span class="label">Distance</span><span class="value"><<if _dist >= 99>>Unknown<<else>><<print _dist>> tiles<</if>></span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Answer the plea">>
<<goto "Event_Federation_PleaForAid_Response">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _r = _entry ? _entry.federationPleaResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _member = _data.memberName ?? "your ally">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Answer Given</h2>
<<if _r>>
<<if _r.choice is "help" and _r.failedStart>>
<p>You try to send help, but the warbands cannot form before the fighting slips out of reach.</p>
<<elseif _r.choice is "help">>
<p>You answer the call and send warriors toward <b><<print _member>></b>. If the warbands can form before the moment passes, the oath will be answered in blood rather than words.</p>
<<else>>
<p>You refuse the call. <b><<print _member>></b> is left to face the threat alone, and the federation oath sounds weaker by nightfall.</p>
<</if>>
<div class="result-list">
<<if _r.relation>><div class="result-line <<if _r.relation.delta >= 0>>good<<else>>bad<</if>>"><span class="label"><<print _r.relation.tribeName>></span><span class="value"><<if _r.relation.delta >= 0>>+<</if>><<print _r.relation.delta>> relations (<<print _r.relation.before>> -> <<print _r.relation.after>>)</span></div><</if>>
<<if _r.cohesion>><div class="result-line bad"><span class="label">Cohesion</span><span class="value"><<print _r.cohesion.before>> -> <<print _r.cohesion.after>></span></div><</if>>
</div>
<<else>>
<p>The plea slips away unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let them carry your answer home.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_plea_for_aid") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _member = _data.memberName ?? "a federation member">>
<<set _attacker = _data.attackerName ?? "a hostile tribe">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>The Oath Is Tested</h2>
<p><b><<print _member>></b> waits for more than your sympathy. Send warriors and you begin a defense raid: one of your warbands and one allied warband against <b><<print _attacker>></b>. Refuse, and they will rember that as well...Well if any of them remain that is.</p>
<div class="result-list">
<div class="result-line good"><span class="label">Send help</span><span class="value">+10 relations, begin defense raid</span></div>
<div class="result-line bad"><span class="label">Refuse</span><span class="value">-20 cohesion, -20 relations</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Send Help">>
<<run setup.federation.acceptPleaForAid()>>
<<if $raidV1 and $raidV1.active>><<goto "Raid_V1_Battle">><<else>><<goto "Event_Federation_PleaForAid_Resolve">><</if>>
<</button>>
<<button "Refuse">>
<<run setup.federation.resolvePleaForAidRefusal()>>
<<goto "Event_Federation_PleaForAid_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_raid") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _sponsor = _data.sponsorName ?? "a federation member">>
<<set _target = _data.targetName ?? "a rival tribe">>
<<set _temp = _data.sponsorTemperament ?? "unknown">>
<<if _entry and !_entry.federationRaidState>><<set _entry.federationRaidState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>The Raid</h2>
<p>Warriors from <b><<print _sponsor>></b> come to your fire with paint already drying on their faces. They have marked <b><<print _target>></b> for a raid, but they want the federation's leading voice to bless the strike.</p>
<p>If you support them, the burden becomes yours as well: lead the raid yourself, and one of their warbands will stand beside you for this quest raid only.</p>
<div class="result-list">
<div class="result-line"><span class="label">Sponsor</span><span class="value"><<print _sponsor>> (<<print _temp>>)</span></div>
<div class="result-line"><span class="label">Target</span><span class="value"><<print _target>></span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Support the raid">>
<<if $currentEvent>><<set $currentEvent.federationRaidState.choice = "support">><<goto "Event_Federation_Raid_Resolve">><</if>>
<</button>>
<<button "Forbid it">>
<<if $currentEvent>><<set $currentEvent.federationRaidState.choice = "forbid">><<goto "Event_Federation_Raid_Resolve">><</if>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_raid") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.federationRaidState) ? (_entry.federationRaidState.choice ?? "forbid") : "forbid">>
<<if _entry and !_entry.federationRaidResult>><<run setup.federation.resolveFederationRaidChoice(_choice)>><</if>>
<<set _r = _entry ? _entry.federationRaidResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _sponsor = _data.sponsorName ?? "a federation member">>
<<set _target = _data.targetName ?? "a rival tribe">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Answer Given</h2>
<<if _r>>
<<if _r.choice is "support" and _r.quest and _r.quest.ok>>
<p><b><<print _sponsor>></b> receives your blessing. The promise now has teeth: strike <b><<print _target>></b> and prove the federation can answer insult with force.</p>
<<elseif _r.choice is "support">>
<p>You try to bless the raid, but another federation obligation is already pulling at your camp. The warriors leave without the clear answer they wanted.</p>
<<else>>
<p>You forbid the raid. <b><<print _sponsor>></b> obeys, but their warriors leave angry and the federation feels less like a promise than a leash.</p>
<</if>>
<div class="result-list">
<<if _r.quest and _r.quest.ok>><div class="result-line good"><span class="label">Quest added</span><span class="value"><<print _r.quest.quest.name>></span></div><</if>>
<<if _r.relation>><div class="result-line bad"><span class="label"><<print _r.relation.tribeName>></span><span class="value"><<print _r.relation.delta>> relations (<<print _r.relation.before>> -> <<print _r.relation.after>>)</span></div><</if>>
<<if _r.cohesion>><div class="result-line bad"><span class="label">Cohesion</span><span class="value"><<print _r.cohesion.before>> -> <<print _r.cohesion.after>></span></div><</if>>
</div>
<<else>>
<p>The raid argument slips away unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let them act on your word.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_trade_guard") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _sponsor = _data.sponsorName ?? "a federation member">>
<<set _target = _data.targetName ?? "an outside tribe">>
<<if _entry and !_entry.federationTradeGuardState>><<set _entry.federationTradeGuardState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Guard the Deal</h2>
<p>Traders from <b><<print _sponsor>></b> come to your fire with guarded voices. They say they have made a deal with <b><<print _target>></b>, but they do not trust the other tribe to honor the exchange once goods are on the ground.</p>
<p>They ask you to be present nearby. Not to bargain for them, and not to threaten first. Only to stand close enough that betrayal has a cost.</p>
<div class="result-list">
<div class="result-line"><span class="label">Federation traders</span><span class="value"><<print _sponsor>></span></div>
<div class="result-line"><span class="label">Other tribe</span><span class="value"><<print _target>></span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Accept">>
<<if $currentEvent>><<set $currentEvent.federationTradeGuardState.choice = "accept">><<goto "Event_Federation_TradeGuard_Resolve">><</if>>
<</button>>
<<button "Refuse">>
<<if $currentEvent>><<set $currentEvent.federationTradeGuardState.choice = "refuse">><<goto "Event_Federation_TradeGuard_Resolve">><</if>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_trade_guard") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.federationTradeGuardState) ? (_entry.federationTradeGuardState.choice ?? "refuse") : "refuse">>
<<if _entry and !_entry.federationTradeGuardResult>><<run setup.federation.resolveTradeGuardOfferChoice(_choice)>><</if>>
<<set _r = _entry ? _entry.federationTradeGuardResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _sponsor = _data.sponsorName ?? "a federation member">>
<<set _target = _data.targetName ?? "an outside tribe">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Answer Given</h2>
<<if _r>>
<<if _r.choice is "accept" and _r.quest and _r.quest.ok>>
<p><b><<print _sponsor>></b> accepts your presence as surety. A timed obligation has been marked: reach the meeting with <b><<print _target>></b> before the deal goes cold.</p>
<<elseif _r.choice is "accept">>
<p>You try to accept the request, but another federation obligation already has your name on it. The traders leave with no promise they can trust.</p>
<<else>>
<p>You refuse to stand with their traders. <b><<print _sponsor>></b> takes the answer as abandonment, and the federation oath feels thinner around the fire.</p>
<</if>>
<div class="result-list">
<<if _r.quest and _r.quest.ok>><div class="result-line good"><span class="label">Quest added</span><span class="value"><<print _r.quest.quest.name>> - 8 turns</span></div><</if>>
<<if _r.relation>><div class="result-line bad"><span class="label"><<print _r.relation.tribeName>></span><span class="value"><<print _r.relation.delta>> relations (<<print _r.relation.before>> -> <<print _r.relation.after>>)</span></div><</if>>
<<if _r.cohesion>><div class="result-line bad"><span class="label">Cohesion</span><span class="value"><<print _r.cohesion.before>> -> <<print _r.cohesion.after>></span></div><</if>>
</div>
<<else>>
<p>The request slips away unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Send them on with your answer.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_weak_link") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _weak = _data.weakName ?? "the weaker tribe">>
<<set _strong = _data.strongName ?? "the aggressive tribe">>
<<set _weakMil = Number(_data.weakMil ?? 0)>>
<<set _strongMil = Number(_data.strongMil ?? 0)>>
<<set _canPay = Number($resources ?? 0) >= 50>>
<<set _protectLabel = "Protect " + _weak + " openly">>
<<set _demandLabel = "Demand " + _weak + " contribute more">>
<<if _entry and !_entry.federationWeakLinkState>><<set _entry.federationWeakLinkState = {}>><</if>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>The Weak Link</h2>
<p>Speakers from <b><<print _strong>></b> arrive with hard faces and harder words. They say <b><<print _weak>></b> takes shelter beneath the federation oath without carrying enough of its danger.</p>
<p>The threat is not open rebellion, not yet. But everyone hears the shape of it. A stronger member has found a weaker one, and now the shared fire waits to see whether you protect, pressure, or pay the difference yourself.</p>
<div class="result-list">
<div class="result-line"><span class="label">Weaker tribe</span><span class="value"><<print _weak>> (Mil <<print _weakMil>>)</span></div>
<div class="result-line"><span class="label">Pressure tribe</span><span class="value"><<print _strong>> (Mil <<print _strongMil>>)</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button _protectLabel>>
<<if $currentEvent>><<set $currentEvent.federationWeakLinkState.choice = "protect">><<goto "Event_Federation_WeakLink_Resolve">><</if>>
<</button>>
<<button _demandLabel>>
<<if $currentEvent>><<set $currentEvent.federationWeakLinkState.choice = "demand">><<goto "Event_Federation_WeakLink_Resolve">><</if>>
<</button>>
<<if _canPay>>
<<button "Make up the difference (50 resources)">>
<<if $currentEvent>><<set $currentEvent.federationWeakLinkState.choice = "makeup">><<goto "Event_Federation_WeakLink_Resolve">><</if>>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires 50 resources.">Make up the difference (50 resources)</span>
<</if>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_federation_weak_link") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.federationWeakLinkState) ? (_entry.federationWeakLinkState.choice ?? "protect") : "protect">>
<<if _entry and !_entry.federationWeakLinkResult>><<run setup.federation.resolveWeakLinkChoice(_choice)>><</if>>
<<set _r = _entry ? _entry.federationWeakLinkResult : null>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<set _weak = _data.weakName ?? "the weaker tribe">>
<<set _strong = _data.strongName ?? "the aggressive tribe">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Burden Answered</h2>
<<if _r>>
<<if _r.choice is "demand">>
<p>You tell <b><<print _weak>></b> to carry more of the shared burden. <b><<print _strong>></b> approves, while the weaker camp hears the verdict as humiliation.</p>
<<elseif _r.choice is "makeup">>
<p>You cover the shortfall yourself. <b><<print _weak>></b> receives breathing room, while <b><<print _strong>></b> accepts the answer only grudgingly.</p>
<<else>>
<p>You shield <b><<print _weak>></b> openly. The weaker camp remembers the protection, and <b><<print _strong>></b> remembers the insult.</p>
<</if>>
<div class="result-list">
<<if _r.spent > 0>><div class="result-line bad"><span class="label">Your resources</span><span class="value">-<<print _r.spent>></span></div><</if>>
<<if _r.tribeResourceGain > 0>><div class="result-line good"><span class="label">Weaker tribe resources</span><span class="value">+<<print _r.tribeResourceGain>></span></div><</if>>
<<for _i = 0; _i < _r.changes.length; _i++>>
<<set _c = _r.changes[_i]>>
<div class="result-line <<if _c.delta >= 0>>good<<else>>bad<</if>>"><span class="label"><<print _c.tribeName>></span><span class="value"><<if _c.delta >= 0>>+<</if>><<print _c.delta>> relations (<<print _c.before>> -> <<print _c.after>>)</span></div>
<</for>>
</div>
<<else>>
<p>The pressure slips away unresolved.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the camps live with it.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
Under the water's surface, the woman on the stone shudders violently. Her head lolls back, breaking the kiss as she struggles to stifle a cry, her mouth opening in a silent gasp of pleasure.
The ripples around her thighs give away the frantic rhythm of the other's fingers, pumping relentlessly into her. It is a raw, desperate display of sapphic lust, hidden yet brazen, playing out just feet away from the tribe's protector.
<<nsfwimgnew "images/events/female_love/scene_solo.png">>
They are rutting in a haze of fear and ecstasy, unaware that the danger they dread is already standing right there, watching their every move.
</div>''
</div>
<div class="hub-buttons">
<<button "Leave them to their fun.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
As you finish setting up the camp, you feel it first—then see it.
Far off in the distance: smoke. And beneath the wind, voices.
Your tribe doesn’t seem to notice yet. But you do.
Life—dense and steady—gathered in one place. A community larger than any you have ever known… or remember.
Almost without deciding to, you drift away from your own fires and toward it.
Hours pass. Maybe days. The sun climbs, falls, climbs again— and you cannot bring yourself to care.
Then, at last—
you see it.
<img src="images/events/LakeFind/LakeCity.png" alt="Amogus">
A camp unlike any you have seen before.
No.
Calling it a 'camp' doesn’t do it justice.
This is something else.
A ''settlement''.
From a distant rise you watch it for a long while— the movement within, the steady rhythm of many lives. It pulls at your thoughts like a chant. Hypnotic.
You only break yourself free when you spot hunters moving along the outer paths.
For now, you slip away.
Back into brush and shadow, back through the thickets, back toward your own camp.
What you’ve seen here settles behind your eyes.
It gives you far too much to think about.
</div>''
<div class="hub-buttons">
<<button "Return to your own fires.">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
The last of the funerals are coming to an end as you make your way through camp.
Enough time has passed for work to begin again. Hunters sit near one of the fires checking spearheads and replacing worn bindings. Someone has started repairing a shelter damaged during the fighting, while a handful of children have returned to their usual games between the tents.
But the camp has not found its rhythm again.
Fresh mounds of packed earth sit beyond the nearest shelters, each marked in whatever small ways the families of the dead saw fit. People still linger around some of them. An older man sits alone before one with his hands resting between his knees. At another, two women speak quietly until one begins crying again and the other pulls her close.
Further along, you see Aedan.
His mother kneels beside one of the fresh mounds, shoulders shaking as she weeps into her hands. Aedan stands beside her.
The boy says nothing. He simply looks down at the freshly turned earth, his face strangely still for someone so young.
You do not interrupt them.
There are things the camp needs from you, and things that will have to wait until people are ready to give them.
By the time you reach your tent, the sounds of mourning have faded behind you.
You push the flap aside and step inside.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Enter the tent.</span>">>
<<goto "Event_Major_ACityRemembered_Tent">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags["mishan_city_remembered_rewarded"]>>
<<run setup.mishan.adjustPreparedness(10)>>
<<set $questFlags["mishan_city_remembered_rewarded"] = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
Halona is waiting for you.
She sits near the edge of the firelight with her arms wrapped tightly around herself, one hand gripping the opposite arm. Her gaze remains fixed somewhere near the floor even after she hears you enter.
You watch her for a moment before asking what is wrong.
Her eyes flick toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Nothing. I was sitting quietly. You're the one who decided that meant something was wrong.</span>
</div>
You point out that she is sitting quietly in your tent.
Halona finally looks up.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So?</span>
</div>
She holds your gaze for a moment before looking away again.
Only then do you notice the folded hide beside her.
Your attention lingers on it long enough that she notices. Halona exhales through her nose, reaches down, and picks it up.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">That, at least, is why I came.</span>
</div>
She holds it out to you.
When you unfold the hide, you understand why she waited until you were alone.
The drawing is far more intricate than the rough maps your people usually make. A wide body of water dominates much of it, its shoreline carefully marked in charcoal. Beside it sits the Mishan city, drawn from above in dense lines: roads, clustered structures, entrances, defensive boundaries, stretches of open ground, and dozens of smaller marks whose meanings are not immediately obvious.
Halona shifts closer and points toward one of the entrances.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">That was one of the main ways into the city when I lived there. This road was used by traders. These were storehouses. Here was where my father gathered the warriors when he needed to go protect an outpost.</span>
</div>
Her finger follows another line toward the lake.
<<if $questFlags and $questFlags.halona_family_history_known>>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Being the chief's daughter had some uses. My father spoke freely around us, and I learned early that listening was usually more useful than talking.</span>
</div>
She gives you a sidelong glance.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Especially when nobody thinks the chief's daughter is listening.</span>
</div>
<<else>>
You look at her, and she catches the question in your expression.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">My father was the chief before Kavnok. Tiksi was meant to succeed him.</span>
</div>
She gives you little time to dwell on the revelation before returning her attention to the hide.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I grew up around his councils. I heard where men were being sent, what needed guarding, which stores mattered when trouble came. Children are very easy to ignore when adults think the conversation is above them.</span>
</div>
<</if>>
She turns the hide slightly and traces the edge of the settlement.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">There were smaller ways in as well. Paths used by fishermen, hunters, people who did not want to walk through the main entrances. Some of them may still exist.</span>
</div>
Her finger pauses over one of the charcoal marks.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But do not mistake this for the city as it is now. Kavnok has had time to change things. Guards move. Stores move. Buildings can be torn down and rebuilt.</span>
</div>
She shifts her hand toward the broader features surrounding the settlement.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">The lake and the hills are where they always were. Kavnok cannot change those. The main roads should still exist too, even if he has changed where they lead inside the city or who watches them.</span>
</div>
She studies the drawing for another moment.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It is old information. Useful, but old.</span>
</div>
Even with everything she cannot tell you, it is more than your people knew yesterday.
You ask why she waited until now to give it to you.
Halona grows quiet again. Her arms fold around herself, tighter this time, while her eyes remain fixed on the charcoal city between you.
When she finally answers, there is none of the usual sharpness in her voice.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Because it is my home. Was my home.</span>
</div>
She draws in a slow breath.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">They betrayed my family. They cast me out. They hunted Tiksi. I know exactly what they did to us, and I know what Kavnok has turned that place into. None of that changes where I grew up, or the people I knew there.</span>
</div>
Her fingers tighten against her arm.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It still feels like betrayal to hand you this.</span>
</div>
You leave the contradiction unanswered.
For a while, Halona stares down at the drawing. When she speaks again, the bitterness in her voice has dulled into something quieter.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Kael went to that lake because I told you where to look. Kavnok killed him, and men from the tribe that took me in died with him. I cannot undo any of that.</span>
</div>
She finally raises her eyes to yours.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But if I keep what I know to myself now, all I am doing is protecting the people who cast me out from the people who gave me somewhere to go.</span>
</div>
Her gaze drops back toward the hide.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I do not know if that makes this right. I only know which choice I can live with.</span>
</div>
She pushes the map farther toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Use it. Just find out what has changed before you trust it too much.</span>
</div>
You take the hide and study the city again.
Halona cannot tell you what waits behind every wall now, but she has given you its old bones: the roads leading toward it, the entrances people once used, places where food and supplies were kept, and the ground upon which the city itself was built.
For the first time since Kavnok came to your camp, Mishan feels a little less like a distant shape you know almost nothing about.
<<if $questFlags and $questFlags.heart_to_heart_outcome is "stay">>
You lower the hide and find Halona looking away again.
You step closer, placing a hand against the side of her face and gently turning her back toward you.
Her eyes narrow.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Now is hardly the time for that.</span>
</div>
The irritation in her voice would be more convincing if she actually pulled away.
She does not.
After a moment, some of the tension leaves her shoulders and she leans into your palm. When you close the remaining distance, she meets you halfway.
The kiss is brief and softer than the ones that came before it, without the usual heat or challenge passing between you. When you separate, Halona remains close for another moment before finally drawing back.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">...Idiot.</span>
</div>
There is very little force behind it.
She looks toward the map again.
<</if>>
Halona settles back near the fire.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Keep it. It will do more good with you than buried among my things.</span>
</div>
You spread the hide out where the firelight can reach it.
There is still much you do not know about Mishan.
But there is less than there was yesterday.
<div class="result-list">
<div class="result-line good">
<span class="label">Preparedness</span>
<span class="value">+10</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Keep the map close.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = setup.aDeedRewarded.getCurrentEntry()>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_a_deed_rewarded") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _state = _entry ? setup.aDeedRewarded.ensureState(_entry) : null>>
<<set _data = _state ? _state.data : {}>>
<<set _supply = _entry ? setup.aDeedRewarded.applySupplyGain(_entry) : null>>
<<set _npcName = _data.npcName ?? "one of your men">>
<<set _concubines = setup.aDeedRewarded.getConcubineCandidates()>>
<<set _goodsOk = Number($goods ?? 0) >= 6>>
<</silently>>
''<div class="hub-textbox">
One of your men, <b><<print _npcName>></b>, is brought before you with half the camp already speaking of what he has done.
<br><br>
Some say he led a small group of scouts farther than usual and returned with more than anyone expected. Others insist the real worth of it was not the food or supplies, but the boldness it took to claim them. Whatever the truth, the result is plain enough: the tribe is better off because of him.
<br><br>
He stands before you trying not to look too pleased with himself, though he fails badly at it. Around him, the others wait to see how you will reward a man who has made himself useful.
<<if _supply>>
<div class="result-list">
<div class="result-line good"><span class="label">Gain</span><span class="value"><<print _supply.amount>> <<print _supply.label>></span></div>
</div>
<</if>>
How do you answer his deed?
</div>''
<div class="hub-buttons">
<<button "Give him words of thanks.">><<goto "Event_Major_ADeedRewarded_Words">><</button>>
<<if _goodsOk>>
<<button "Give him a proper reward.">><<goto "Event_Major_ADeedRewarded_Goods">><</button>>
<<else>>
<span class="macro-button disabled" title="Requires 6 Goods.">Give him a proper reward.</span>
<</if>>
<<if _concubines.length > 0>>
<<button "Give him one of your concubines for the night.">><<goto "Event_Major_ADeedRewarded_Concubine">><</button>>
<<else>>
<span class="macro-button disabled" title="Requires an assigned Concubine.">Give him one of your concubines for the night.</span>
<</if>>
</div><<silently>>
<<set _entry = setup.aDeedRewarded.getCurrentEntry()>>
<<set _state = _entry ? setup.aDeedRewarded.ensureState(_entry) : null>>
<<set _data = _state ? _state.data : {}>>
<<set _npcName = _data.npcName ?? "the hunter">>
<<set _hasSelected = !!(_state and _state.concubineId)>>
<<if _hasSelected>>
<<set _result = (_entry and _state and _state.concubineId) ? setup.aDeedRewarded.applyConcubineGift(_entry, _state.concubineId) : null>>
<<set _scene = (_state and _state.scene) ? _state.scene : null>>
<<set _maleName = _data.npcName ?? "The hunter">>
<<set _concubineName = _scene ? _scene.name : (_state ? (_state.concubineName ?? "Your concubine") : "Your concubine")>>
<<else>>
<<set _intro = _entry ? setup.aDeedRewarded.applyConcubineChoice(_entry) : null>>
<<set _concubines = setup.aDeedRewarded.getConcubineCandidates()>>
<</if>>
<</silently>>
<<if _hasSelected>>
''<div class="hub-textbox">
<<print _maleName>> steps closer to the partition where your concubine waits. She stands near the furs, her body bare, <<if _scene>><<print _scene.breastIntro>><<else>>her breasts exposed to the warm air<</if>>. <<if _scene>><<print _scene.posture>><</if>>
<br><br>
The hunter's rough hands move to her <<if _scene>><<print _scene.breasts>><<else>>medium<</if>> breasts. <<if _scene>><<print _scene.breastTouch>><</if>>
<br><br>
She lowers herself onto the furs. He positions himself behind her, gripping her <<if _scene>><<print _scene.butt>><<else>>medium<</if>> ass. <<if _scene>><<print _scene.buttTouch>><</if>>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print _concubineName>></span>
<span class="dialogue-line">"<<if _scene>><<print _scene.line>><<else>>I will do what is asked.<</if>>"</span>
</div>
<<nsfwimg "images/events/a_deed_rewarded/sex.webm">>
He pushes into her, her <<if _scene>><<print _scene.bodyType>><<else>>average<</if>> frame rocking forward with each thrust. <<if _scene>><<print _scene.motion>><</if>>
<<nsfwimg "images/events/a_deed_rewarded/creampie.webm">>
The hunter finishes with a groan, pulling free and wiping his brow. He thanks you with a deep nod before leaving the tent.
<<if _result>>
<div class="result-list">
<<if _result.loveDelta >= 0>>
<div class="result-line good"><span class="label"><<print _concubineName>> Love</span><span class="value"><<if _result.loveDelta > 0>>+<</if>><<print _result.loveDelta>></span></div>
<<else>>
<div class="result-line bad"><span class="label"><<print _concubineName>> Love</span><span class="value"><<print _result.loveDelta>></span></div>
<</if>>
<<if _result.obedienceDelta>>
<div class="result-line good"><span class="label"><<print _concubineName>> Obedience</span><span class="value">+<<print _result.obedienceDelta>></span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Consider him rewarded.">><<endMajorEvent>><</button>>
</div>
<<else>>
''<div class="hub-textbox">
You let the camp see your approval clearly.
<br><br>
Food fills the belly. Goods weigh nicely in the hand. Words can flatter a man for a time. But a reward drawn from your own tent carries a different weight.
<br><br>
The meaning of your offer settles over the watching crowd quickly enough. <b><<print _npcName>></b> understands it before you finish speaking, and the grin he tries to hide makes that plain.
<br><br>
You rise, and the gathered onlookers part without needing to be told. This reward is not for the whole camp to witness.
<br><br>
Back inside your tent, only one choice remains.
<br><br>
Who will you send to him?
<<if _intro>>
<div class="result-list">
<div class="result-line good"><span class="label"><<print _npcName>> Trust</span><span class="value">+15</span></div>
<div class="result-line good"><span class="label"><<print _npcName>> Obedience</span><span class="value">+5</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<if _concubines.length > 0>>
<<for _i = 0; _i < _concubines.length; _i++>>
<<set _c = _concubines[_i]>>
<<capture _c>>
<<button _c.name>>
<<if _state>><<set _state.concubineId = _c.id>><<set _state.concubineName = _c.name>><</if>>
<<goto "Event_Major_ADeedRewarded_Concubine">>
<</button>>
<</capture>>
<</for>>
<<else>>
<span class="macro-button disabled">No concubines assigned</span>
<</if>>
</div>
<</if>><<silently>>
<<set _entry = setup.aDeedRewarded.getCurrentEntry()>>
<<set _result = _entry ? setup.aDeedRewarded.applyGoods(_entry) : null>>
<<set _npcName = _result ? _result.npcName : "the hunter">>
<</silently>>
''<div class="hub-textbox">
You glance toward one of the younger men standing nearby and gesture toward the stores.
<br><br>
The boy hurries off, understanding your intent, and soon returns with a small collection of goods: trinkets, worked pieces, and useful things with enough value to pass for a true reward. You have them placed into <b><<print _npcName>>'s</b> hands before the watching camp.
<br><br>
It is not excessive, but it is solid. A deed was done, and a reward was given. The order of things feels properly kept.
<<if _result and _result.ok>>
<div class="result-list">
<div class="result-line bad"><span class="label">Goods</span><span class="value">-6</span></div>
<div class="result-line good"><span class="label"><<print _npcName>> Trust</span><span class="value">+10</span></div>
</div>
<<else>>
<div class="result-list">
<div class="result-line bad"><span class="label">Goods</span><span class="value">Not enough</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the reward speak for itself.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = setup.aDeedRewarded.getCurrentEntry()>>
<<set _result = _entry ? setup.aDeedRewarded.applyWords(_entry) : null>>
<<set _npcName = _result ? _result.npcName : "the hunter">>
<</silently>>
''<div class="hub-textbox">
<<if _result>>
<div class="result-list result-list-check">
<<if _result.success>>
<div class="result-line good"><span class="label">Charisma check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Charisma check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
</div>
<</if>>
You rise just enough for the camp to notice, letting your gaze settle on <b><<print _npcName>></b>.
<br><br>
Then you smile paternally, as words of praise leave your mouth.
<br><br>
You speak of what he brought back, of the risk taken, and of the strength shown by a man who did more than wait for orders. It costs you nothing but breath, but breath from your mouth carries weight.
<br><br>
<<if _result and _result.success>>
The words do their work.
<br><br>
<b><<print _npcName>></b> tries to keep his expression steady, but the pride in his eyes gives him away. By the time he steps back into the crowd, his shoulders are higher, his grin harder to hide. It seems recognition from you was reward enough.
<<else>>
But your words end up sounding like empty promises, and like his deed is not being recognized.
<br><br>
<b><<print _npcName>></b> bows his head and accepts them, yet the disappointment is plain. Whatever he expected after such a deed, a few spoken praises before the camp were not enough to make him feel truly rewarded.
<</if>>
<<if _result>>
<div class="result-list">
<<if _result.trustDelta >= 0>>
<div class="result-line good"><span class="label"><<print _npcName>> Trust</span><span class="value"><<if _result.trustDelta > 0>>+<</if>><<print _result.trustDelta>></span></div>
<<else>>
<div class="result-line bad"><span class="label"><<print _npcName>> Trust</span><span class="value"><<print _result.trustDelta>></span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let your words stand.">><<endMajorEvent>><</button>>
</div><<silently>><<set _entry = setup.aFavorReturned.getCurrentEntry()>><<set _state = setup.aFavorReturned.ensureEntryState(_entry)>><</silently>>''<div class="hub-textbox"><br>
A small group of tribespeople approaches you near the centre of camp.
They have gathered to deal with several neglected tasks. A damaged shelter needs straightening. One of the drying racks has begun to sag. Loose materials must be carried, sorted, and put to use before they are scattered or spoiled.
None of them were assigned to the work.
Some have helped one another during past hunts. Others have shared food, tended unattended fires, or lent their hands when sickness and injury left a task unfinished. Now those favours are being returned.
There are enough willing hands to complete the work.
What they lack are usable tools.
In theory, the camp should already have enough. In practice, people rarely tell anyone when they take one, where they leave it, or whether they return it at all. Whatever tools are not currently being used have become scattered throughout the camp.
The group asks you to prepare a shared bundle of handles, wedges, cutting edges, and bindings.
With those, they believe they can manage the rest themselves.
They are willing to wait for a time.
Not forever.</div>''<div class="hub-buttons"><<button "Make the tools they need.">><<run setup.aFavorReturned.recordChoice(setup.aFavorReturned.getCurrentEntry(), "accept")>><<goto "Event_Major_AFavorReturned_Resolve">><</button>><<button "Leave them to find another way.">><<run setup.aFavorReturned.recordChoice(setup.aFavorReturned.getCurrentEntry(), "reject")>><<goto "Event_Major_AFavorReturned_Resolve">><</button>></div><<silently>><<set _entry = setup.aFavorReturned.getCurrentEntry()>><<set _state = setup.aFavorReturned.resolveChoice(_entry)>><<if _state and _state.choice is "accept">>
<<set _endLabel = "Let them get to work.">>
<<else>>
<<set _endLabel = "They can make do.">>
<</if>>
<</silently>>''<div class="hub-textbox"><<if _state and _state.choice is "accept">>You agree to provide what they need, so long as they see the work through.
The group disperses soon afterward. Each returns to their usual work, intending to gather again once the tools are ready.
<div class="result-list"><div class="result-line good"><span class="label">Task added</span><span class="value">A Favor Returned</span></div><div class="result-line"><span class="label">Objective</span><span class="value">Craft a Bundle of Shared Tools before the volunteers disperse.</span></div><div class="result-line"><span class="label">Time limit</span><span class="value">4 turns</span></div></div><<else>>You make it clear that the tribe’s materials will not be spent on the request.
The group accepts the decision without argument. A favour may be requested, but it cannot be demanded.
They turn their attention toward the few worn tools already available and begin discussing what can still be accomplished without your help.
Some of the work may still be completed.
The rest will have to wait.
<div class="result-list"><div class="result-line bad"><span class="label">Lost</span><span class="value"><<print _state.zealLoss>> Zeal</span></div></div><</if>></div>''<div class="hub-buttons">
<<button _endLabel>><<endMajorEvent>><</button>></div><<silently>>
<<set _data = setup.aPlaceInCamp.beginEvent()>>
<<set _lockedPassage = setup.aPlaceInCamp.getLockedPassage()>>
<<if _lockedPassage>><<goto _lockedPassage>><</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_data>>
The opportunity has passed before the request can be made.
<<else>>
It is a day like any other, and you have only just finished the work occupying your attention when you return to your tent.
Before you can settle, <b><<print _data.npcName>></b> asks permission to speak with you.
You grant it, and wait to hear what they have to say.
As they begin, it becomes clear that their words are carefully respectful. Perhaps even rehearsed. But the longer they speak, the clearer their purpose becomes. <b><<print _data.npcName>></b> wishes to take up the duties of <<print setup.aPlaceInCamp.renderDemandedPositionHtml(_data)>>.
The question now remains: will you entertain the idea?
<</if>>
</div>''
<div class="hub-buttons">
<<if _data>>
<<button "Allow It">><<goto "Event_Major_APlaceInCamp_Allow">><</button>>
<<button "Deny Them">><<goto "Event_Major_APlaceInCamp_Deny">><</button>>
<<if setup.aPlaceInCamp.canProposition(_data)>>
<<button "Ask for something in return">>
<<set _proposition = setup.aPlaceInCamp.startProposition()>>
<<if _proposition>><<goto "Event_Major_APlaceInCamp_Proposition">><</if>>
<</button>>
<</if>>
<<else>>
<<button "Return to your duties.">><<endMajorEvent>><</button>>
<</if>>
</div><<silently>>
<<set _result = setup.aPlaceInCamp.applyChoice("allow")>>
<<set _data = _result ? _result.data : null>>
<</silently>>
''<div class="hub-textbox">
<<if !_result>>
The request can no longer be granted.
<<else>>
You do not leave them waiting long.
If <b><<print _data.npcName>></b> truly believes they can carry the duties of <b><<print _data.positionName>></b>, then they will be given the chance to prove it.
For a moment, they seem almost unsure they heard you correctly. Perhaps surprised by your quick approval. Then understanding settles in. Their posture straightens, their expression sharpens, and whatever nervousness brought them into your tent is replaced by something warmer.
Gratitude. Pride. Perhaps even loyalty.
<b><<print _data.npcName>></b> thanks you, then excuses themselves, clearly eager to take up their new duties.
<<if _data.mismatch>>
Not everyone is pleased with the new <b><<print _data.positionName>></b>.
It is not long before you hear the mutters spreading through camp. Some say this is no work for a <<print _data.npcGenderNoun>>. Others say you have bent the old ways too far for one follower’s ambition.
No one challenges you openly.
But the camp feels a little less settled than before.
<</if>>
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let them prove themselves.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _scene = setup.aPlaceInCamp.getSceneData()>>
<</silently>>
''<div class="hub-textbox">
<<if !_scene>>
The arrangement can no longer be completed.
<<else>>
<<if _scene.permissivePartner>>
<<print setup.escapeHtml(_scene.npcName)>> doesn't bother keeping her voice down. Her eyes stay level with yours, unbothered.
<<elseif _scene.restrictivePartner>>
<<print setup.escapeHtml(_scene.npcName)>> keeps her voice low, movements contained, her gaze drifting toward the tent flap between gestures.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"I... What happened here stays between us, ok?"</span>
</div>
<</if>>
<<if _scene.route is "willing">>
<<print setup.escapeHtml(_scene.npcName)>> closes the distance and takes your wrist, guiding your hand to her hip. She pulls you in.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"I was hoping you'd ask."</span>
</div>
Her fingers work at your clothing, stripping layers with practiced efficiency. She presses her body flush against yours, mouth finding your jaw, your neck.
<<elseif _scene.route is "compliant">>
<<print setup.escapeHtml(_scene.npcName)>> stands at the edge of arm's reach. She doesn't close the distance. Her hands hang at her sides, fingers still, waiting for you to set the terms in motion.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"I know what I agreed to."</span>
</div>
She doesn't resist when your hands find her hips, but she doesn't lean in either. Her breathing stays measured, each exhale deliberate as your fingers work at her clothing. When the fabric drops, she stands still and lets you look.
<<if _scene.proud>>
She keeps her chin level, refusing to avert her eyes even as color rises in her face.
<</if>>
<<if _scene.gentle>>
She folds her arms across her bare chest for a moment before forcing them down.
<</if>>
<<if _scene.negativeLove>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Just... get on with it. We both know why I'm here."</span>
</div>
<</if>>
<<else>>
<<print setup.escapeHtml(_scene.npcName)>> steps forward before you reach for her. She pulls her own clothing loose with efficient hands, baring herself with the composure of someone who decided this was worth the price hours ago.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"<<print setup.escapeHtml(_scene.counterofferPositionName)>>. That's what this costs me, so that's what I'm paying for it."</span>
</div>
<<if _scene.highLove>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Don't look at me like that. I wanted the position. You just happened to come with it."</span>
</div>
<</if>>
<</if>>
<<if _scene.bodyType is "heavyset">>
Her full, generous figure settles against you with yielding warmth, soft flesh spreading beneath your hands wherever you grip. Weight presses into you from every direction, her body conforming to yours as she moves. Her thick waist fills your hold when you reach for her sides, her broad back warm and heavy under your palms.
<<elseif _scene.bodyType is "strong">>
Her solid frame meets yours with dense, resistant pressure. Muscle shifts under warm skin as she moves, firm against your palms wherever you grab. Her toned legs lock around your hips with genuine strength when she pulls you in, and the flat planes of her stomach flex against your abdomen with each thrust.
<<elseif _scene.bodyType is "lean">>
Her narrow frame presses against yours with light, angular warmth. The ridges of her ribs show faintly beneath her skin when she arches, hip bones sharp under your grip. Her slender legs lock around you tight, her weight easy to shift, easy to reposition with one hand on her waist.
<<elseif _scene.bodyType is "broad">>
Her wide frame meets yours with solid, encompassing warmth. Her shoulders are broad, her back wide and strong, her build substantial without softness. She takes up real space around you, her solid build pressing heavily wherever your bodies connect, grounding you flat against the bedroll with her weight alone.
<</if>>
<<if _scene.breastSize is "flat">>
Her chest is bare and smooth, small nipples hardening under your palms as you trace the flat plane of her sternum.
<<elseif _scene.breastSize is "small">>
Her tits fill your hands, soft and round, nipples stiffening against your fingers when you squeeze.
<<elseif _scene.breastSize is "medium">>
Her breasts sway as she moves, full enough to spill around your grip, nipples dark and responsive to your mouth.
<<elseif _scene.breastSize is "large">>
Her heavy tits press against your chest when she leans in, soft flesh yielding and spreading warm under your hands.
<<else>>
Her massive breasts spill forward with every movement, overwhelming your hands when you grab them, heavy and pendulous.
<</if>>
<<if _scene.buttSize is "flat">>
Her ass is lean and firm under your palms, taut muscle beneath smooth skin.
<<elseif _scene.buttSize is "small">>
Her ass rounds compact in your grip, firm, fitting your hands.
<<elseif _scene.buttSize is "medium">>
Her ass fills your grip with warm flesh that yields when you squeeze and pull her against you.
<<elseif _scene.buttSize is "large">>
Her thick ass ripples when you grip it, heavy and soft, spreading under your fingers.
<<else>>
Her enormous ass dominates her frame, flesh spilling past your hands when you grab hold.
<</if>>
<<nsfwimg "images/events/a_place_in_camp/1.webp">>
<<print setup.escapeHtml(_scene.npcName)>> guides you down. Her legs spread over your hips and her wet heat takes your cock in one slow descent.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Fuck... you feel good."</span>
</div>
<<if _scene.proud>>
She rides you with deliberate control, setting the pace, refusing to surrender the rhythm.
<</if>>
<<if _scene.cautious>>
She moves slowly, testing each angle, watching your face for what works.
<</if>>
<<if _scene.highLove>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"I've wanted this. Wanted you."</span>
</div>
<</if>>
<<if _scene.negativeLove && _scene.route is "willing">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Don't get sentimental. We both want this."</span>
</div>
<</if>>
<<if _scene.route is "willing">>
Her rhythm breaks. She grinds down hard, thighs clenching around your hips, her voice filling the tent in rough broken syllables. Her pussy clamps tight around your cock as she comes, body shaking.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Don't stop, don't fucking stop—"</span>
</div>
<<elseif _scene.route is "compliant">>
Her rhythm stutters. Her grip on your shoulders tightens, knuckles pressing white, her jaw setting hard as her body clenches around you. A sharp inhale punches through her measured breathing. Her hips buck once, twice, before she forces herself still. The tremor runs through her thighs anyway, legs shaking where they lock around you.
<<if _scene.proud>>
She turns her head away, eyes shut, lips pressed thin as the orgasm takes her despite her control.
<</if>>
<<if _scene.gentle>>
Her face drops to your shoulder, muffling the sound that drags out of her, fingers curling hard against your chest.
<</if>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Nnh... that's... fine. That's fine."</span>
</div>
<<else>>
She drives her hips down with purpose, grinding through her peak on her terms. Her thighs squeeze tight as she comes, back arching, a low groan pulling from deep in her chest. She takes what she needs from your body with the same efficiency she brought to the negotiation, riding every last wave before her pace finally slows.
<<if _scene.highLove>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Don't you dare stop, I'm almost— fuck, FUCK, yes."</span>
</div>
<</if>>
<</if>>
<<if _scene.route is "counteroffer">>
She dismounts without lingering. Her feet hit the ground and she reaches for her clothes, dressing with brisk, efficient hands. No backward glance at you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"<<print setup.escapeHtml(_scene.counterofferPositionName)>>. I held up my end."</span>
</div>
She pulls her belt tight, fingers checking the buckle twice.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Clean slate after this. We clear?"</span>
</div>
<<if _scene.highLove>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"Don't read into it. We both got exactly what we wanted."</span>
</div>
<</if>>
<<else>>
She catches her breath, still straddling you, palms flat against your chest.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_scene.npcName)>></span>
<span class="dialogue-line">"<<print setup.escapeHtml(_scene.requestedPositionName)>>. We had a deal."</span>
</div>
She climbs off and reaches for her clothes, the satisfaction on her face carrying no shame.
<</if>>
<<print setup.campDispute.resultRowsHtml(_scene.result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "A deal is a deal.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _state = setup.aPlaceInCamp.getState()>>
<<set _result = _state && _state.rejectionCommitted ? _state.result : setup.aPlaceInCamp.rejectCounteroffer()>>
<<set _data = _state ? _state.data : null>>
<</silently>>
''<div class="hub-textbox">
<<if !_result || !_data>>
The rejected bargain has already passed beyond recall.
<<else>>
You refuse her terms.
<<print setup.escapeHtml(_data.npcName)>> watches you for a moment, waiting to see whether there is anything more to say.
There is not.
Her mouth tightens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Then neither of us gets what we wanted."</span>
</div>
She turns and leaves the tent.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let her go.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _result = setup.aPlaceInCamp.applyChoice("deny")>>
<<set _data = _result ? _result.data : null>>
<</silently>>
''<div class="hub-textbox">
<<if !_result>>
The request fades without an answer.
<<else>>
You let them finish.
For a moment, silence hangs between you. <b><<print _data.npcName>></b> waits, trying to remain stoic as they wait to hear your answer.
Then you refuse.
You state it plainly. The duties of <b><<print _data.positionName>></b> will not be theirs.
<b><<print _data.npcName>></b> lowers their gaze. Perhaps they want to argue. If they do, they do not dare.
They thank you for hearing them, then excuse themselves from your tent.
The camp returns to its usual rhythm, but <b><<print _data.npcName>></b> leaves with slower steps than when they entered.
<<if _data.mismatch>>
It is not long before whispers spread through camp.
Snickers. Nods. Quiet approval. Some say <b><<print _data.npcName>></b> should have known better than to ask for work meant for <<print _data.expectedGenderPlural>>.
Whatever pain your refusal caused them, the camp seems to approve of your decision.
<</if>>
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the matter end there.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _view = setup.aPlaceInCamp.getPropositionView()>>
<<set _state = _view ? _view.state : null>>
<<set _data = _view ? _view.data : null>>
<<set _result = null>>
<<if _view && _view.outcome is "refusal">>
<<set _result = setup.aPlaceInCamp.commitRefusal()>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_view || !_data>>
The proposition can no longer be resolved.
<<else>>
<<print setup.aPlaceInCamp.propositionCheckHtml(_state)>>
<<if _view.outcome is "willing">>
For a moment, <<print setup.escapeHtml(_data.npcName)>> simply looks at you.
Then the meaning of your offer settles in.
Her expression shifts. Surprise first, then something warmer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"That is what you want in return?"</span>
</div>
You give her the time to reconsider.
She does.
Then she steps closer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Alright."</span>
</div>
A faint smile touches her mouth.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Then we have a deal."</span>
</div>
<<elseif _view.outcome is "compliant">>
<<print setup.escapeHtml(_data.npcName)>> goes still.
Her eyes remain on you, but whatever hope had been showing in them a moment ago fades behind something more careful.
She understands exactly what you are asking.
For several seconds, she says nothing.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"If that is what it takes..."</span>
</div>
Her jaw tightens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Fine. I agree."</span>
</div>
There is no enthusiasm in the answer, but neither is there hesitation once she has made it.
<<elseif _view.outcome is "counteroffer">>
<<print setup.escapeHtml(_data.npcName)>> stares at you for a long moment.
Then she gives a short, humorless breath through her nose.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"For <<print setup.escapeHtml(_data.positionName)>>?"</span>
</div>
She shakes her head.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"No."</span>
</div>
She does not leave.
Instead, her expression sharpens as she studies you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"But if that is the kind of bargain you want to make..."</span>
</div>
Her eyes remain fixed on yours.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Give me <<print setup.escapeHtml(_state.counterofferPositionName)>>."</span>
</div>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"Then we have a deal."</span>
</div>
<<if _state.displacedNpcId>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"I know <<print setup.escapeHtml(_state.displacedNpcName)>> holds it. That is your problem, not mine."</span>
</div>
<</if>>
<<else>>
<<print setup.escapeHtml(_data.npcName)>>'s expression hardens almost immediately.
Whatever nervousness brought her here disappears.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"No."</span>
</div>
The answer is quiet, but absolute.
She looks at you for another moment, then turns toward the entrance.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print setup.escapeHtml(_data.npcName)>></span>
<span class="dialogue-line">"I should not have asked."</span>
</div>
She leaves without waiting for another response.
<<if _result>><<print setup.campDispute.resultRowsHtml(_result.rows)>><</if>>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<if !_view || !_data>>
<<button "Return to your duties.">><<endMajorEvent>><</button>>
<<elseif _view.outcome is "willing" or _view.outcome is "compliant">>
<<button "Continue">>
<<set _commit = setup.aPlaceInCamp.acceptArrangement(_view.outcome)>>
<<if _commit>><<goto "Event_Major_APlaceInCamp_Arrangement">><</if>>
<</button>>
<<elseif _view.outcome is "counteroffer">>
<<button "Accept Her Terms">>
<<set _commit = setup.aPlaceInCamp.acceptArrangement("counteroffer")>>
<<if _commit>><<goto "Event_Major_APlaceInCamp_Arrangement">><</if>>
<</button>>
<<button "Reject Her Terms">>
<<set _reject = setup.aPlaceInCamp.rejectCounteroffer()>>
<<if _reject>><<goto "Event_Major_APlaceInCamp_CounterofferReject">><</if>>
<</button>>
<<else>>
<<button "Let her go.">><<endMajorEvent>><</button>>
<</if>>
</div><<silently>>
<<set _entry = setup.aRiteRequested.getCurrentEntry()>>
<<set _state = setup.aRiteRequested.beginQuest(_entry)>>
<</silently>>
''<div class="hub-textbox">
<br>
Restlessness has begun to spread through the camp.
Nothing terrible has happened. No great omen has appeared, nor has any single misfortune driven the concern.
Still, people have begun to notice how long it has been since the tribe last gathered for something sacred.
Quiet conversations have turned into open requests.
Some want an offering. Others speak of blessings, omens, or old customs that should not be neglected for too long.
A few even approach you directly.
The tribe wants a ritual.
They are willing to wait.
For a while, at least.
<div class="result-list">
<div class="result-line good"><span class="label">Task added</span><span class="value">A Rite Requested</span></div>
<div class="result-line"><span class="label">Objective</span><span class="value">Perform any ritual before the tribe's patience runs out.</span></div>
<div class="result-line"><span class="label">Time limit</span><span class="value">4 turns</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Now where did I put that ritual stick...">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = setup.voiceInTheNight.getCurrentEntry()>>
<<set _state = setup.voiceInTheNight.ensureState(_entry)>>
<<set _riteKeeper = setup.voiceInTheNight.getRiteKeeper()>>
<</silently>>
''<div class="hub-textbox">
<br>
The commotion begins before the morning fire has properly caught.
A tribesperson stands near its edge, surrounded by a small gathering of curious faces. They look tired, but far too alert for someone only recently woken.
A dream, apparently.
Not an ordinary one.
They speak of a familiar voice heard where no person stood. Of paths twisting through places they know, yet somehow made strange. Of stones, trees, water, and fire appearing where they should not, each seeming important for reasons they cannot explain.
Some insist an ancestor must have spoken.
Others whisper of spirits.
A few are less convinced, but they listen all the same.
By the time you arrive, the dream has already been repeated several times.
Each telling draws another interpretation.
Whatever visited this person in the night, the tribe is beginning to wonder whether it meant something.
</div>''
<div class="hub-buttons">
<<button "Interpret the vision yourself.">><<run setup.voiceInTheNight.selectChoice(_entry, "interpret")>><<goto "Event_Major_AVoiceInTheNight_Resolve">><</button>>
<<button "Encourage the tribe to heed the vision.">><<run setup.voiceInTheNight.selectChoice(_entry, "encourage")>><<goto "Event_Major_AVoiceInTheNight_Resolve">><</button>>
<<if _riteKeeper>>
<<button "Have the Rite Keeper judge it.">><<run setup.voiceInTheNight.selectChoice(_entry, "rite_keeper")>><<goto "Event_Major_AVoiceInTheNight_Resolve">><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires an assigned Rite Keeper.">Have the Rite Keeper judge it.</span>
<</if>>
<<button "Ignore it.">><<run setup.voiceInTheNight.selectChoice(_entry, "ignore")>><<goto "Event_Major_AVoiceInTheNight_Resolve">><</button>>
</div><<silently>>
<<set _entry = setup.voiceInTheNight.getCurrentEntry()>>
<<set _result = setup.voiceInTheNight.applyOutcome(_entry)>>
<<set _state = setup.voiceInTheNight.ensureState(_entry)>>
<</silently>>
''<div class="hub-textbox">
<<if _result and _result.choice is "interpret">>
<div class="result-list result-list-check">
<<if _result.success>>
<div class="result-line good"><span class="label">Wisdom check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Wisdom check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label">Wisdom + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
</div>
<<if _result.success>>
You take the dream apart piece by piece.
The strange path. The shape of the land. The repeated image that seemed meaningless to the dreamer, but not to you.
Eventually, something begins to fit.
You lead several tribespeople toward a place near camp that matches enough of what was described to be worth searching.
At first, there is nothing.
Then someone notices disturbed earth beneath a tangle of roots.
What lies beneath is old, but useful.
Worked pieces. Small ornaments. Carefully wrapped objects that must have been hidden and forgotten long before your tribe arrived.
By the time everything is carried back to camp, even the doubters have grown quiet.
Perhaps the dream meant exactly what you claimed it did.
Or perhaps you were simply clever enough to make meaning from it.
Either way, the tribe looks to you for the answer.
<<else>>
You listen carefully and offer the meaning that seems most likely.
The dreamer nods. Others murmur their agreement.
For a time, your interpretation holds.
Then the questions begin.
One detail does not fit another. A place you thought familiar proves wrong. Something you treated as important was remembered differently the next time the dream is told.
Before long, certainty begins to fray.
No one openly dismisses your judgment, but neither does the tribe seem satisfied by it.
The dream remains unexplained.
And without a clear answer from you, attention slowly returns to the voice that began the whole matter.
<</if>>
<<if _result.rows.length>><<print setup.voiceInTheNight.resultRowsHtml(_result.rows)>><</if>>
<<elseif _result and _result.choice is "encourage">>
You do not try to claim the dream for yourself.
If something chose to speak through an ordinary tribesperson, then the tribe can decide what weight to give it.
The response is immediate.
Questions begin again. Older memories are compared against what was seen. People argue over whether the voice belonged to an ancestor, a spirit of the land, or something stranger still.
No single answer wins.
That does not seem to matter.
The dream has been accepted as something worthy of attention.
For the rest of the morning, the sacred feels a little less distant.
And a little less confined to any single voice.
<<elseif _result and _result.choice is "rite_keeper">>
You leave the matter to someone better suited to it.
The Rite Keeper, <<print _result.riteKeeperName>>, is called forward and listens as the dream is repeated once more.
They ask for details others ignored.
Where the voice came from. What stood nearest. Which image appeared first. Which one lingered after waking.
The gathering grows quieter as the questions continue.
No grand declaration follows.
Instead, <<print _result.riteKeeperName>> gives the dream a place among the tribe's other signs and warnings, neither dismissing it nor pretending certainty where none exists.
The answer seems to satisfy most of those gathered.
The dream remains mysterious.
But it has been heard.
<<print setup.voiceInTheNight.resultRowsHtml(_result.rows)>>
<<elseif _result and _result.choice is "ignore">>
You have other things to concern yourself with.
A strange dream, however vivid, is not enough to pull your attention away from the needs of the camp.
You leave the gathering to its own arguments.
They continue without you.
By midday, several different meanings have already been proposed. One person swears it was an ancestor. Another insists the dream belonged to the place itself. Others simply listen and remember.
No conclusion is reached.
Perhaps one is not even needed.
The people seem satisfied simply to have something strange to wonder about, another story to pass between fires and another possibility to argue over when the day's work allows it.
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the dream become a story.">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = $currentEvent>>
<</silently>>
''<div class="hub-textbox">
You sit in the large communal tent, the one used to hold councils and decide the camp's next course of action, rubbing your eyes as the last of your hunters leave. Another dispute over hunting grounds, settled. Your eyes ache in the dim lamplight, your shoulders stiff from hours of listening to grievances. Or well, they would with most people. With you, it is only your mind that is tired. You push back from the chieftain's table and step outside into the cool night air.
The central fire still burns low, its glow reaching across the clearing in warm amber strokes. You hear them before you see them. Soft, breathless sounds drifting between the huts. A woman's gasp. The rhythmic creak of leather. Laughter that melts into moans.
Around the fire, your tribe has gathered in twos and threes. Bare skin glistens where the firelight catches it. A hunter has a woman bent over a fallen log, her fingers gripping the bark, her breasts swaying with each thrust, her mouth open and smiling. Nearby, two women lie tangled together in the furs, one straddling the other's face while grinding down with slow rolls of her hips.
<<nsfwimg "images/events/after_dark/orgy.webm">>
Nobody hides. Nobody hurries. They move together openly, shamelessly, enjoying the moment. The smell of sex and smoke hangs thick in the night air.
One couple near the treeline notices you standing there. The woman, riding her partner with her back arched and her tits bouncing freely, catches your eye. She does not stop. She smiles at you, slow and knowing, and turns her attention back to her pleasure.
You are their chieftain. This is the way you have guided them. And it certainly seems relaxing.
</div>''
<div class="hub-buttons">
<<button "Maybe I should join them sometime...">><<endMajorEvent>><</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
You move through the underbrush in silence.
Then you throw your spear.
It strikes with a crack, and by the time you push through the last of the brush, the deer is already on the ground, twitching as it dies. You approach without hurry, ready to retrieve your weapon and begin skinning it, when a scream tears through the trees.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">Aah—AAH!</span>
</div>
A man lunges at you from the side, thin as a corpse and clutching a crude knife.
He swings wildly. The blade bites shallowly into your flesh, just enough to draw blood. A few drops strike the trunk of the nearby tree.
You do not think.
Your fist lashes out and catches him full on.
He drops at once.
You turn, ready to strike again if needed, but the man does not move.
For a moment, you only stare at him. Then you kneel.
He is starving. Barely more than bones wrapped in skin. Hollow-eyed. Weak enough that a blow that should not have killed him, did. Perhaps you only ended something that had been ending for days already.
His face is unknown to you.
You search him and find nothing. No charm, no marking, no sign of tribe or kin. Only the knife, crude and worn, and a body the wild had already half-claimed.
By then, the cut he gave you has already closed.
So you rise, pull your spear from the dying deer, and finish your work.
When the skinning is done, you throw the hide and meat over your shoulder and start back toward camp.
But before leaving, you look back once.
At the dead man in the dirt.
At the deer beside him.
At the tree, broad and ancient, its roots half-bared from the earth.
And at the dark smear of your blood upon its bark.
Then you leave the place behind.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the memory behind</span>">>
<<endMajorEvent>>
<</button>>
</div><<print setup.breakingPoint.renderEventHtml()>><<print setup.breakingPoint.renderResultHtml()>><<silently>>
<<set _created = setup.brokenChain.beginQuest()>>
<<set _quest = _created.quest>>
<</silently>>
''<div class="hub-textbox">
<h2>Broken Chain</h2>
<<if _created.ok>>
Two scouts return to camp together.
Neither looks alarmed.
Interested, perhaps.
Uneasy.
One finds you first.
<div class="dialogue-inset">
<span class="dialogue-speaker">Scout</span>
<span class="dialogue-line">“We saw a group moving through the country. Not far.”</span>
</div>
You ask how many.
He glances toward the other.
<div class="dialogue-inset">
<span class="dialogue-speaker">Scout</span>
<span class="dialogue-line">“Eight armed. Four more with them.”</span>
</div>
A pause.
<div class="dialogue-inset">
<span class="dialogue-speaker">Scout</span>
<span class="dialogue-line">“The four were tied together.”</span>
</div>
That gets your attention.
The second scout crouches and draws a rough trail through the dirt with one finger.
They had followed from a distance for long enough to be certain.
Eight people carrying spears, clubs, bows, and stone blades.
Their equipment looked well kept.
Nothing remarkable on its own.
Just more consistent than most wandering groups.
Good hafts.
Proper bindings.
Clothing repaired before it became rags.
And between them walked four adults with rope around their wrists.
Two men.
Two women.
None appeared wounded badly enough to stop walking.
The group is moving steadily.
They will not remain nearby for long.
If you want to know where they are going, there is still time to follow.
<div class="result-list">
<div class="result-line good"><span class="label">Quest Discovered</span><span class="value">Broken Chain</span></div>
<div class="result-line"><span class="label">Time available</span><span class="value">3 turns</span></div>
<div class="result-line"><span class="label">Location</span><span class="value">Marked on the map</span></div>
</div>
<<else>>
<p><<print _created.reason>></p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Mark the trail.</span>">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_camp_dispute") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = (_ev and _ev.data) ? _ev.data : null>>
<<if _entry and !_entry.campDisputeState>><<set _entry.campDisputeState = {}>><</if>>
<<set _defenderButton = _data ? ("Side with " + _data.defenderName) : "Side with defender">>
<<set _attackerButton = _data ? ("Side with " + _data.attackerName) : "Side with challenger">>
<</silently>>
''<div class="hub-textbox">
<<if !_data>>
The argument has scattered before you had a chance to judge it.
<<else>>
After exiting your tent, you notice a small crowd forming near the camp center, an argument already burning hot enough to draw half the camp attention.
Drawing closer, you recognize the two figures at the heart of it: <b><<print _data.defenderName>></b> and <b><<print _data.attackerName>></b>.
The dispute seems to be about <b><<print _data.defenderName>></b> serving as <b><<print _data.positionName>></b>. <b><<print _data.attackerName>></b> claims the role should belong to someone more fitting in the eyes of the tribe, someone who matches the old expectations of <<if _data.dominantGender is "male">>men<<else>>women<</if>> and authority.
<b><<print _data.defenderName>></b> argues that the position was granted by you, and is therefore beyond reproach.
That answer only seems to enrage <b><<print _data.attackerName>></b> further. The crowd murmurs, then suddenly quiets as your presence is noticed. Both of them turn to you, each waiting for your judgment.
The question is simple. What do you do?
<</if>>
</div>''
<div class="hub-buttons">
<<if _data>>
<<button _defenderButton>>
<<set _entry.campDisputeState.choice = "defender">>
<<set _entry.campDisputeState.data = _data>>
<<goto "Event_Major_CampDispute_Result">>
<</button>>
<<button _attackerButton>>
<<set _entry.campDisputeState.choice = "attacker">>
<<set _entry.campDisputeState.data = _data>>
<<goto "Event_Major_CampDispute_Result">>
<</button>>
<<button "Stay out of it">>
<<set _entry.campDisputeState.choice = "abstain">>
<<set _entry.campDisputeState.data = _data>>
<<goto "Event_Major_CampDispute_Result">>
<</button>>
<<else>>
<<button "Return to your duties.">><<endMajorEvent>><</button>>
<</if>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.id === "major_camp_dispute") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _choice = (_entry and _entry.campDisputeState and _entry.campDisputeState.choice) ? _entry.campDisputeState.choice : "abstain">>
<<set _result = setup.campDispute.applyChoice(_choice)>>
<<set _data = _result ? _result.data : null>>
<</silently>>
''<div class="hub-textbox">
<<if !_result>>
The argument breaks apart before any judgment can settle on it.
<<elseif _result.choice is "defender">>
You decide to make your will known. The position was given by you, and no muttering around the fire will undo it.
<b><<print _data.defenderName>></b> lowers their head, relief and pride mingling in their expression. <b><<print _data.attackerName>></b> says nothing, but their jaw tightens. The crowd accepts your judgment, though not all hearts are eased by it.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<elseif _result.choice is "attacker">>
You side with the voice of custom. Perhaps you truly feel you made a wrong choice appointing them, or maybe you are simply doing what is expected of you.
<b><<print _data.defenderName>></b> is stripped of the position they held, their face hardening as the crowd shifts around them. <b><<print _data.attackerName>></b> looks satisfied, and more than a few nearby followers seem reassured that the old expectations still carry weight.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<else>>
You leave the argument to the camp, declaring this is not yours to settle.
No one stops you. No one dares. But as you return to your tent, the murmuring begins again behind you, lower now, sharper. The matter is not settled. It has merely been left to fester.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the camp live with your judgment.">><<endMajorEvent>><</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_claim_challenged") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _variant = setup.traditionEvents.getClaimChallengedVariant()>>
<<set _levelId = setup.traditionEvents.getBondsOfFleshLevelId()>>
<<if _entry and !_entry.claimChallengedState>>
<<set _entry.claimChallengedState = { choice: null, applied: false, result: null, variant: _variant, levelId: _levelId }>>
<</if>>
<<if _entry and _entry.event>><<set _entry.event.data = Object.assign({}, _entry.event.data || {}, { traditionLevelId: _levelId, variant: _variant })>><</if>>
<</silently>>
''<div class="hub-textbox">
<br>
An argument near one of the tents drags your attention.
<br><br>
<<if _variant is "female">>
As you draw closer, it quickly becomes clear that whatever this began as, it is close to reaching a boiling point. Two women are nearly at each other's throats, held apart only by the desperate efforts of those around them. When one of them notices you, she rips an arm free and points an accusing finger.
<div class="dialogue-inset">
<span class="dialogue-speaker">Offended Partner</span>
<span class="dialogue-line">"Chieftain! That whore laid hands on my man! I demand justice! Her head, at the very least!"</span>
</div>
A distraught-looking man steps forward, his voice sharp with panic.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Distraught Partner</span>
<span class="dialogue-line">"That is not true! You are being dramatic again! We were just-"</span>
</div>
He is cut off by the other woman, whose expression carries far more confidence than caution.
<div class="dialogue-inset">
<span class="dialogue-speaker">Accused Rival</span>
<span class="dialogue-line">"Maybe if you were able to please him, he would not need to turn to others for what you lack."</span>
</div>
The offended woman surges forward again, cursing loudly, while the people holding her back nearly lose their grip. The accused rival turns her attention to you instead, spreading her hands as if the matter should be obvious.
<div class="dialogue-inset">
<span class="dialogue-speaker">Accused Rival</span>
<span class="dialogue-line">"Chieftain, we are a tribe led by strength. Should we not live by it as well? Is it wrong to claim what another cannot keep? I forced nothing. He came to me willingly."</span>
</div>
By now, the whole camp seems to be watching. The offended partner is still shouting obscenities, the accused rival looks far too pleased with herself, and the man at the heart of it all seems torn between fury and humiliation.
<<else>>
As you draw closer, it quickly becomes clear that whatever this began as, it is close to reaching a boiling point. Two men are nearly at each other's throats, held apart only by the desperate efforts of those around them. When one of them notices you, he rips an arm free and points an accusing finger.
<div class="dialogue-inset">
<span class="dialogue-speaker">Offended Partner</span>
<span class="dialogue-line">"Chieftain! That bastard laid hands on my woman! I demand justice! His head, at the very least!"</span>
</div>
A distraught-looking woman steps forward, her voice sharp with panic.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Distraught Partner</span>
<span class="dialogue-line">"That is not true! You are being dramatic again! We were just-"</span>
</div>
She is cut off by the other man, whose expression carries far more confidence than caution.
<div class="dialogue-inset">
<span class="dialogue-speaker">Accused Rival</span>
<span class="dialogue-line">"Maybe if you were able to please her, she would not need to turn to others for what you lack."</span>
</div>
The offended man surges forward again, cursing loudly, while the people holding him back nearly lose their grip. The accused rival turns his attention to you instead, spreading his hands as if the matter should be obvious.
<div class="dialogue-inset">
<span class="dialogue-speaker">Accused Rival</span>
<span class="dialogue-line">"Chieftain, we are a tribe led by strength. Should we not live by it as well? Is it wrong to claim what another cannot keep? I forced nothing. She came to me willingly."</span>
</div>
By now, the whole camp seems to be watching. The offended partner is still shouting obscenities, the accused rival looks far too pleased with himself, and the woman at the heart of it all seems torn between fury and humiliation.
<</if>>
<br><br>
If there is to be any peaceful end to this, it will have to come from you.
<br><br>
What do you do?
</div>''
<div class="hub-buttons">
<<button "It is fine, is it not?">>
<<set _entry.claimChallengedState.choice = "fine">>
<<goto "Event_Major_ClaimChallenged_Resolve">>
<</button>>
<<button "A proper punishment, then.">>
<<set _entry.claimChallengedState.choice = "punish">>
<<goto "Event_Major_ClaimChallenged_Resolve">>
<</button>>
<<button "This is beneath you.">>
<<set _entry.claimChallengedState.choice = "beneath">>
<<goto "Event_Major_ClaimChallenged_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_claim_challenged") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<if _entry and !_entry.claimChallengedState>><<set _entry.claimChallengedState = { choice: "beneath", applied: false, result: null, variant: setup.traditionEvents.getClaimChallengedVariant(), levelId: setup.traditionEvents.getBondsOfFleshLevelId() }>><</if>>
<<set _state = _entry ? _entry.claimChallengedState : null>>
<<set _choice = _state ? (_state.choice ?? "beneath") : "beneath">>
<<if _entry and _state and !_state.applied>>
<<set _state.applied = true>>
<<set _state.result = setup.traditionEvents.applyClaimChallengedOutcome(_entry, _choice)>>
<</if>>
<<set _result = _state ? _state.result : null>>
<<set _levelId = _result ? _result.levelId : setup.traditionEvents.getBondsOfFleshLevelId()>>
<<set _bound = _levelId is "bound_consorts">>
<<set _hasStabilityDefault = !_bound>>
<<set _isCheck = _result and _result.statKey>>
<<set _success = _result and _result.success>>
<</silently>>
''<div class="hub-textbox">
<br>
<<if _isCheck>>
<div class="result-list result-list-check">
<<if _success>>
<div class="result-line good"><span class="label"><<print _result.statKey>> check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label"><<print _result.statKey>> check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label"><<print _result.statKey>> + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
</div>
<</if>>
<<if _choice is "fine">>
You step between them with a calm voice and a faintly amused expression.
<br><br>
No one was stolen. No one was dragged away. No one was forced. A wandering hand, a willing glance, a moment of weakness... are these truly things worth spilling blood over? After all, they still returned in the end, back to the accuser's tent. Does that not make it clear where their heart lies? Is that not the only thing that truly matters?
<br><br>
For a moment, the offended partner looks ready to spit in your face, before remembering who that face belongs to.
<br><br>
<<if _success>>
Slowly, the anger begins to lose its shape. The offended partner curses, but the demand for blood fades. The accused rival says nothing more, wise enough to accept victory without making it worse.
<br><br>
The camp moves on, a little less certain that love should be held quite so tightly.
<<else>>
Your words do not soothe the matter. If anything, they make it worse.
<br><br>
The offended partner hears not wisdom, but mockery. For the moment, no one says anything, because no one dares contradict you openly. But by the time you leave, the argument has grown sharper than before.
<br><br>
<<if _bound>>
The dispute does not end. It festers. Then, after enough bitter nights, it ends in the only way people like this seem to understand.
<br><br>
Maybe the accuser finally decided to act. Maybe the accused grew tired of being hunted by someone they considered lesser. Either way, the camp returns to some semblance of peace, with one less angry voice in it.
<<else>>
The dispute does not end. It festers. Night after night, the same accusations are whispered, shouted, denied, and repeated, now sharpened by the feeling that justice itself was laughed aside.
<</if>>
<</if>>
<<elseif _choice is "punish">>
You let the shouting continue for a few moments longer, watching faces, listening to what is said, and what is avoided.
<br><br>
Then you give your judgment.
<br><br>
A union is not a loose promise to be tested whenever desire stirs. But neither is every insult to a bond worth a head, a corpse, or a blood feud. If a bond is to mean anything, then those who threaten it must be punished properly - not wildly, not weakly, but properly.
<br><br>
<<if _success>>
The accused rival is made to pay for the insult, not with a head, but with shame, labor, and compensation. The accuser is allowed ten blows to the stomach. No more, no less. Blood is denied, but recognition is given.
<br><br>
The camp sees the difference.
<br><br>
By evening, the matter is not forgotten, but it is settled.
<<else>>
Your judgment comes down hard.
<br><br>
Too hard, perhaps. But people learn best when the lesson leaves a mark.
<br><br>
The accused rival's hand is taken before the camp, a bloody answer to wandering touch and loose restraint. The screaming ends quickly, but the lesson lingers. No one can say you failed to defend the meaning of a union.
<br><br>
Still, one less good hand means one less pair of fingers gathering, carving, carrying, and working.
<</if>>
<<else>>
You let out a sigh. If even that.
<br><br>
Then you shake your head and decide to go about your day. Dealing with this sort of petty drama feels beneath you. Do these people have any idea what you are capable of?
<br><br>
In the end, you leave them to handle it themselves and return to more important business. None dare stop you.
<br><br>
<<if _bound>>
And so days pass, with argument after argument. Then, after a certain point, the arguments stop too.
<br><br>
Maybe the accuser finally decided to act. Maybe the accused grew tired of being hunted by someone they considered lesser. Either way, the camp eventually returns to some semblance of peace, with one less angry voice in it.
<<else>>
Still, the arguments drag on. Night after night, the same accusations are whispered, shouted, denied, and repeated. It will be a while before some semblance of peace returns to camp.
<</if>>
<</if>>
<<if _result>>
<div class="result-list">
<<if _result.populationDelta < 0>>
<div class="result-line bad"><span class="label">Lose</span><span class="value"><<print Math.abs(_result.populationDelta)>> Population</span></div>
<</if>>
<<if _result.stabilityDelta < 0>>
<div class="result-line bad"><span class="label">Stability</span><span class="value"><<print _result.stabilityDelta>></span></div>
<<elseif _result.stabilityDelta > 0>>
<div class="result-line good"><span class="label">Stability</span><span class="value">+<<print _result.stabilityDelta>></span></div>
<</if>>
<<if _result.populationDelta is 0 and _result.stabilityDelta is 0 and !_result.bloodyJudgmentApplied>>
<div class="result-line good"><span class="label">No penalty</span><span class="value">None</span></div>
<</if>>
<<if _result.bloodyJudgmentApplied>>
<div class="result-line bad"><span class="label">Gain effect</span><span class="value">Bloody Judgment - Resources -10% for 6 turns</span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Back to work...">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _questAdded = setup.corruptSkull.spawnQuestAtBleedingTile()>>
<</silently>>
''<div class="hub-textbox">
Sleep comes unevenly that night.
At first there are only fragments. Broken things. Wind moving through branches. Wet roots shifting beneath dark soil. A shape half-buried where no shape should be.
Then the dream sharpens.
You are standing in a forest.
At first it is unfamiliar. You move forward, one step, then another, each carrying you farther than it should. The world shifts with every pace. Trees bend into different shapes. Shadows lengthen and recede. Ground that should take minutes to cross passes beneath your feet in moments.
Then you see it.
Before you rises a great tree.
It is familiar.
And yet not.
Greater than it was when you last stood before it.
Larger now. Older too. Its bark is darker, its roots thicker, as though the earth itself has tightened around them. Something lies at its base.
A body.
Thin. Barely more than bone and skin, half-caught in the roots as though the tree had grown around it, or perhaps through it. For a moment you simply stare. Its features are too far gone to make out clearly, worn down by time and decay.
And yet you know it.
The half-starved man who attacked you.
Then your gaze shifts upward.
From one of the thicker branches hangs the corpse of the beast you killed. The same deer whose hide and meat you carried back to camp.
Or what remains of it.
Its body sways without wind.
Its throat hangs open.
Thin dark lines run from it, down the bark, trailing like blood that never dried.
You wake before dawn, the image still clinging to the back of your mind.
At first you tell yourself it was nothing more than a strange dream.
Yet as the day wears on, the memory does not fade.
If anything, it grows sharper.
And before long, you realize something else too...
...You remember exactly where the tree stands.
<<if _questAdded>>
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Corrupt Tree</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Mark the place and return</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullDestroyResolved>>
<<run setup.corruptSkull.destroyRelic()>>
<<set $questFlags.corruptSkullDestroyResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You do not hesitate.
Whether out of wisdom, worry for your people, or simple exhaustion, you take the skull and cast it into the fire. When the flames first touch it, nothing happens.
Then the roots begin to writhe.
Several in camp recoil.
One man curses.
Another nearly drops the torch in his hand.
The bone blackens slowly, far slower than it should. The roots burn faster, curling and snapping in the heat with thin, wet sounds. A foul smell spills from the pyre, thick enough to turn the stomach. More than once, it almost seems as though the skull is trying to split itself open from within.
But in the end, fire does what fire was always meant to do.
It leaves little behind but ash and cracked fragments.
When it is done, the air itself feels lighter.
Not clean. That would be too strong a word.
But lighter.
Whatever that skull was, whatever it was becoming, it no longer matters.
The only thing that matters is that it is gone.
And your camp is safer for it.
<div class="result-list">
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Corrupt Skull removed</span>
</div>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Relic bad events ended</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let the fire finish its work</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullKeepResolved>>
<<run setup.corruptSkull.upgradeRelic()>>
<<set $questFlags.corruptSkullKeepResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You look at the skull.
At the blackened roots wrapped through it.
At the wet trails beneath its empty eyes.
At the fear in the faces around you.
And still, you do not burn it.
Perhaps that is exactly why you do not.
No one argues.
No one dares.
Not because they agree, but because something in your voice leaves no room for defiance. You stoop and take the relic in hand once more, pulling it free from the dead hunter’s body. As you do, its tendrils slide across your wrist and coil partway up your arm in a gesture that feels, disturbingly, almost affectionate.
The thing has changed.
What remains is sharper now.
Stronger.
Hungrier.
And as you hold it, you can feel that hunger answering something in you.
It is yours now.
Not to fear.
Not to flee from.
To command.
To use.
Behind you, the camp remains quiet.
Too quiet.
That is fine.
They understand.
And those who do not...
will.
<div class="result-list">
<div class="result-line good">
<span class="label">Relic upgraded</span>
<span class="value">Awakened Corrupt Skull</span>
</div>
<div class="result-line bad">
<span class="label">Effect</span>
<span class="value">Stage 2 relic events unlocked</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Claim what it has become</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const S = setup.corruptSkull.ensureState();
if (!S.upgradeHunterLossApplied) {
State.variables.pops = Math.max(0, Number(State.variables.pops ?? 0) - 1);
S.upgradeHunterLossApplied = true;
}
})()>>
<</silently>>
''<div class="hub-textbox">
It begins before dawn.
A scream tears through the camp, sudden and sharp enough to pull even the heaviest sleeper upright. By the time you rise, others are already moving. Weapons in hand. Voices low. Fear spreading faster than sense.
The source is found quickly.
Not far from where your things were kept.
At first, it looks as though the skull lies in the dirt.
Then your eyes adjust.
Not dirt.
A body.
Half-buried, twisted into the soil as though the earth had begun swallowing it whole.
One of your hunters.
No one admits to touching the relic. No one claims to have moved it. Yet there it is, resting atop the corpse in the pale half-light, glistening as though it had only just been dragged from fresh earth. The roots clinging to it are thicker now. Longer. Darker. Some have pushed fully through the eye sockets. Others snake downward into the dead man’s flesh, so deep and so tight that there is little doubt what they had been doing.
And from those hollow sockets, something wet runs slowly down the bone.
Not blood.
Not quite.
But close enough that no one present mistakes what it resembles.
For a long moment, the entire camp is silent.
No one steps closer.
Then someone whispers that the thing should have been burned the moment it was brought here.
Perhaps they are right.
Even now, looking at it, you can feel the same pull you felt beneath the tree.
Only stronger now.
More certain.
The relic has changed.
And somewhere deep inside, you know the truth of it.
It changed because of you...For you.
The choice before you feels simpler now than it did the first time.
Destroy it.
Or keep it.
<div class="result-list">
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-1</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Destroy the relic</span>">>
<<goto "Event_Major_CorruptTree_Destroy">>
<</button>>
<<button "<span class='choice-text'>Keep the relic</span>">>
<<goto "Event_Major_CorruptTree_Keep">>
<</button>>
</div><<print setup.costlyBlunder.renderEventHtml()>><<print setup.costlyBlunder.renderResultHtml()>><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
It is one of those days again.
The kind where every quiet moment is mistaken for an invitation to place another burden in your hands. Before the sun has properly climbed, someone comes to you about missing food. A strip of dried meat here, a handful of berries there. Enough to start an argument. Enough to warrant your attention...Apparently.
Then Morag sends someone to fetch you, because apparently the spirits refuse to be reasoned with unless you are standing nearby looking important.
After that, there are hides to scrape, bones to split, and animal after animal to skin until the air around you smells of blood, smoke, and wet fur.
You would say it is tiring, but that would be a lie. Usually, tiredness takes quite a while to come upon your <<if $height < 175>>smaller <<elseif $height > 190>>large <</if>>body.
Usually.
Yet now, as you find yourself seated near Morag’s fire, listening to the old woman drone on about herbs, smoke, signs, and things that may or may not be spirits, you cannot help but feel your attention begin to slip.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">No, not that bowl.</span>
<span class="dialogue-bridge">Morag mutters, swatting your hand with two fingers.</span>
<span class="dialogue-line">The cracked one. The old things remember better. New things are always too proud of themselves.</span>
</div>
She sprinkles something bitter-smelling into the embers.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">If the smoke turns blue, say nothing. If it turns green, spit over your left shoulder. If it turns black, then either something is angry, something is pleased, or the wood is damp. Hard to tell.</span>
</div>
You blink.
Morag keeps talking.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Now, the important part is the order. Bone first, then ash, then the little root with the ugly hairs. Unless it was gathered under moonlight, in which case ash first, then bone, then you curse the root for being difficult...</span>
</div>
Her voice continues, dry and certain and endless, but the words begin to lose their shape. Smoke curls upward. The fire pops softly. Somewhere beyond her, the camp blurs into warmth and shadow.
Your eyes begin to close...
ever...
so...
slowly.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<run setup.stopAllAudio ? setup.stopAllAudio() : (typeof SimpleAudio !== "undefined" && SimpleAudio.stop ? SimpleAudio.stop() : null)>>
<<run setup.beginEchoesBlackoutGoto ? setup.beginEchoesBlackoutGoto("Event_Major_Echoes_2", { holdMs: 5000, fadeInMs: 4200 }) : Engine.play("Event_Major_Echoes_2")>>
<</button>>
</div>''<div class="hub-textbox">
...Before the voice slowly drifts back into focus.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Hey.</span>
</div>
Something flicks lightly against your forehead.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Are you listening to me?</span>
</div>
The voice is feminine. Familiar in a way that makes no sense. Close enough to stir something in you, distant enough that reaching for it only makes the ache worse.
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">What is<span class="corrupt-name" data-text="—̷̦̈́—̶̥͝—̸̝͂">—̷̦̈́—̶̥͝—̸̝͂</span> having you do that you keep falling asleep all the time?</span>
</div>
You try to focus on her features.
You see nothing.
Or more accurately, Your mind refuses to hold the shape of what stands before you. Her face slips away each time you reach for it, leaving only the certainty that she is there. That her eyes, whatever color they are, are fixed on you.
<img src="images/events/echoes/her.png" alt="Amogus">
And that she is smiling.
An unfamiliar smile. A nostalgic smile. One you know without remembering. One that feels wasted on you.
An exaggerated sigh follows.
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Regardless of what it is, it remains your sacred duty to listen to my ills,</span>
<span class="dialogue-bridge">She says, with the grave authority of someone announcing a royal decree.</span>
<span class="dialogue-line">To fail in that duty is worth no less than execution.</span>
<span class="dialogue-bridge">A pause.</span>
<span class="dialogue-line">Possibly two executions, if I am feeling especially wounded.</span>
</div>
You feel, more than see, the smile return.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Now. Where was I?</span>
</div>
She begins again, her voice flowing on as if your lapse has been judged, sentenced, and mercifully ignored.
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Right. So then I told her that if she does not wish to wear the cloth for her family’s prestige, she might simply find herself a handsome Plastos and let them walk in on a scene with them...</span>
</div>
You try to listen.
You truly do.
But the words begin to stretch. Her voice softens at the edges, becoming warm, distant, and unbearably familiar. The shape of her remains just beyond you. A presence. A smile. A pair of unseen eyes watching you with something that might be fondness, or pity.
Will she punish you for this?
Or is the punishment of not seeing her more than enough?
Whatever the answer, your eyes drift closed again, and darkness takes you.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "Event_Major_Echoes_3">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _echoesPowerLimitGain = 0>>
<<if !$questFlags["major_echoes_power_limit_granted"]>>
<<set $powerLimitMax = Number($powerLimitMax ?? 1) + 1>>
<<set $questFlags["major_echoes_power_limit_granted"] = true>>
<<set _echoesPowerLimitGain = 1>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">...Wake...</span>
</div>
A sharp blow cracks against your temple.
Not a fist. A walking stick.
Almost enough to hurt you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Up!</span>
</div>
Your eyes fly open to find old Morag standing over you, her stick still raised and her mouth pressed into a thin, offended line.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">I remember when you first came here,</span>
<span class="dialogue-bridge">She says, eyeing you with open accusation.</span>
<span class="dialogue-line">Before I had my first wrinkle, before half these fools knew which end of a spear to hold. I have seen you hunt for days without sleep. Seen you stand through storms, clashes, and worse.</span>
</div>
She jabs the end of her stick toward the fire.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">And now, when I am trying to teach you how to commune with spirits properly, something any chieftain worth his salt should know, this is when you decide to grow tired?</span>
</div>
Perhaps you mean to say something.
Morag’s sigh cuts you off before the first word can form.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">I swear...</span>
</div>
She turns away, muttering as she goes.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">The spirits test me every day.</span>
</div>
She continues grumbling under her breath as she walks off, her stick thumping against the ground with every irritated step.
It is not the first time you have found yourself on Morag’s bad side. Luckily, she forgets as quickly as she angers. Some of the younger members of the tribe attribute that to her age, but having known her for a long time, you know better.
It is simply her nature.
Still, as you are left alone before the fire, you cannot help but think back to the dream you had, even as the details slip away from you like smoke through your fingers.
A voice. A smile. A presence you knew without remembering.
Then even that begins to fade.
Yet something of it remains. A warmth beneath your ribs. A shape settling back into place. For the first time in longer than you can name, you feel a little less unfinished.
<<if _echoesPowerLimitGain > 0>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power Limit</span>
<span class="value">+1</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Hold on to what remains.">>
<<run setup._echoesLostTimeTimer ? clearTimeout(setup._echoesLostTimeTimer) : null>>
<<run setup._echoesLostTimeTimer = null>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("LostTime") : null>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
One day, you find yourself with surprisingly little work to do, a rarity that has only grown rarer. With nowhere in particular to be, you wander through camp for a while.
Partway through, a familiar sensation returns: someone is watching the camp. Watching you.
It is not the first time you have noticed it, but whoever is responsible has never been this bold.
You turn at once toward the place the feeling came from. By the time your gaze reaches the bushes, whoever was there is already gone. All that remains is an empty gap in the brush, disturbed leaves, and branches bent out of place.
Someone was watching, and they only just left. If you move now, you may still be able to catch their trail.
What do you do?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go after them</span>">>
<<goto "Event_Major_EyesInDaytime_Pursue">>
<</button>>
</div><<silently>>
<<run setup.menuTheme && setup.menuTheme.set(4)>>
<<run setup.stopHeartbeat && setup.stopHeartbeat()>>
<<run if (setup.bleedingOverlay) { setup.bleedingOverlay.soundSrc = "sounds/heartbeat.mp3"; setup.bleedingOverlay.trackId = "heartbeat"; }>>
<<run setup.stopBattle ? setup.stopBattle() : (SimpleAudio.select("Battle") ? SimpleAudio.select("Battle").stop() : 0)>>
<<run setup.campPositions && setup.campPositions.removeNpcAssignments ? setup.campPositions.removeNpcAssignments("npc_kael") : null>>
<<run setup.playAmputation ? setup.playAmputation() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("amputation")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "amputation";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _failedMissingScouts = false>>
<<set $questFlags["eyes_in_daytime_done"] = true>>
<<if $quests and $quests.length>>
<<for _qf = 0; _qf < $quests.length; _qf++>>
<<if $quests[_qf] and String($quests[_qf].id) is "q_kael_missing_scouts_01" and String($quests[_qf].status) is "active">>
<<set $quests[_qf].status = "failed">>
<<set $quests[_qf].markerRevealed = false>>
<<set $quests[_qf].desc = "Kael died before the missing scouts could be recovered. The search died with him.">>
<<set $quests[_qf].objective = "Failed">>
<<set _failedMissingScouts = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _failedMissingScouts>>
<<set $questFlags["q_kael_missing_scouts_01_failed"] = true>>
<<set $questFlags["q_kael_missing_scouts_01"] = false>>
<<if String($trackedQuestId ?? "") is "q_kael_missing_scouts_01">><<set $trackedQuestId = "">><</if>>
<<if $trackedQuestIds and $trackedQuestIds.length>>
<<set $trackedQuestIds = $trackedQuestIds.filter(function (id) { return String(id) !== "q_kael_missing_scouts_01"; })>>
<</if>>
<<if $untrackedQuestIds and $untrackedQuestIds.length>>
<<set $untrackedQuestIds = $untrackedQuestIds.filter(function (id) { return String(id) !== "q_kael_missing_scouts_01"; })>>
<</if>>
<</if>>
<<run setup.mishan && setup.mishan.startCampaign ? setup.mishan.startCampaign({ route: "outcast_hostile" }) : null>>
<<addQuestMarkerless
"q_getting_even"
"Getting Even"
"Kavonok struck your camp, slew Kael, and left with your blood on his spear."
"This is not over.(Authors Note: Its Over for now! More content to come so stay tuned!)"
""
>>
<<set _gettingEvenQuestIndex = $quests.findIndex(function (quest) { return quest && String(quest.id ?? "") === "q_getting_even"; })>>
<<if _gettingEvenQuestIndex >= 0>><<set $quests[_gettingEvenQuestIndex].timerSource = "mishan_patience">><</if>>
<</silently>>
''<div class="hub-textbox">
Your legs finally give out, and you drop to your knees in the blood and mud as Halona rushes to your side.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Stay conscious. Don’t fall asleep.</span>
</div>
She gives the order sharply, though the concern in her voice still forces its way through.
You already know you will live. The wound took longer than usual to respond, but it is healing now, as all your wounds eventually do.
Your attention turns instead to the man whose body has no such gift.
Kael lies on the ground, breathing hard, each breath broken by the blood filling his throat. At his side kneels a small, familiar boy.
Aedan.
He clings to his father with both hands, tears running openly down his face.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aedan</span>
<span class="dialogue-line">Dad... don’t. You’ll be fine. Old Morag will fix you up with herbs, o-or the chieftain will do something. Just... please don’t.</span>
</div>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Aedan.</span>
</div>
<<if setup.powerOwned and setup.powerOwned("mend_wounds")>>
For a moment, you think of using your power to mend what is broken and restore what is being lost. But no one knows your limits better than you do. You cannot repair damage like this. Not yet. Trying would only prolong the inevitable and cause him more pain.
<</if>>
Kael forces his son’s name out in a voice that remains stern even now. Then he looks at you.
He has little strength left for speech. All he gives you is one final nod, but you have known Kael since he was a child. The meaning is clear: he is leaving the rest to you.
His gaze returns to Aedan.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Don’t cry, Aedan... You carry my blood. Do not shame it. Live for the tribe, as I did. Protect it... as—</span>
</div>
The hand gripping Aedan loosens. His fingers slacken, and the last light leaves his eyes.
Kael, son of the last chieftain and your right hand, is dead.
The survivors stare in silence. Sobs break out among them, followed by curses as grief gives way to anger and the need for vengeance.
Then, slowly, their eyes turn toward you. You are their chieftain, and they are waiting for you to decide what comes next.
They wait for judgment.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>See to the living.</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("amputation")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<run setup.mishanContact.recordResolution()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
<<if $ambushChoice is "retribution">>
The girl goes rigid beneath you. All the fight drains out of her limbs, leaving her heavy and limp like a sack of grain. She turns her face to the side, pressing it into the dirt and decaying pine needles, squeezing her eyes shut as if by blocking out the light she can also block out what is happening to her body. Her breathing is shallow and rapid, her small chest shivering against your own.
You grip her hips, fingers sinking into the soft flesh of her ass to hold her steady. There is no need for force anymore; she accepts the inevitability of it. The head of your cock pushes against her dry, unyielding entrance. Her body is tense, the muscles locked up in fear, making the initial penetration a struggle of friction and heat.
You thrust forward.
The resistance is overwhelming. Her cunt is a tight, scorched ring that refuses to yield. You feel the skin stretch thin, a groan escaping your lips at the sheer pressure building behind the glans. With a hard, sudden shove, you force your way through.
Her body jerks once, a sharp intake of air that she doesn't let out.
<img src="images/events/ambush/bait.gif" alt="Amogus">
You bury yourself to the hilt. The sensation is suffocating, her inner walls clamping down uncontrollably around your invading shaft.
She is incredibly tight, a furnace of heat that grips every vein and ridge of your cock.
You begin to move, withdrawing slowly before driving back in. Her body rocks with the rhythm of your thrusts, her head lolling limply against the ground. The only sounds are the wet squelch of blood and fluid, the heavy rustle of your bodies moving in the undergrowth, and the soft, broken whimpers she tries to suppress.
<</if>>
<<if $ambushChoice is "questions">>
You question her about the tribe she belongs to, what she was doing here, and why she was watching your camp.
She gives you nothing but silence and heavy, panicked breathing. Your patience thins, and your grip tightens.
<</if>>
<<if $ambushChoice is "sway">>
You let the soft hook of your will slip into her thoughts. Fear does the rest.
Her lips part and her breath catches. One word slips out through the panic.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Woman</span>
<span class="dialogue-line">Camp—</span>
</div>
It is all she manages as one hand reaches toward you almost without thought.
<</if>>
Then something cuts through your focus. Even this far out, your senses catch a sudden commotion from the direction of camp, followed by the smell of blood.
You stop at once. Shoving the woman aside, you are already moving before she hits the ground, sprinting back toward camp as fast as your body will carry you.</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_EyesInDaytime_RushBack">>
<</button>>
</div><<silently>>
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<<if _canSpark>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["eyes_in_daytime_used_spark"] = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
A scream cuts across the camp. It does not belong to one of yours.
Three men burst from the woods, ragged and bloodied but moving with clear purpose. Two throw themselves at the nearest raiders and carve open a path through the chaos. The third drives straight through it toward you and Kavonok.
Before Kavonok can fully turn, a knife flashes for his throat. He twists just in time. The blade fails to sink deep, but it still bites into the flesh near his neck and draws blood.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Sloppy.</span>
</div>
The voice is familiar. Kael.
His tone is the same flat, steady one you know, though rougher and drier now. He drives the knife harder with both hands.
Kavonok’s surprise gives way to amusement.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">I could say the same for you, rat.</span>
</div>
His spear arm moves with an almost lazy flick.
Kael does not flinch. Instead, he turns his head toward you and gives the barest nod. Then he releases the knife and throws his weight forward, twisting around Kavonok’s larger frame and locking him in place.
For the first time, Kavonok sounds almost disappointed.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">What are you—</span>
</div>
Then he understands.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">What a fool.</span>
</div>
His spear arm finishes the motion. A violent flash tears through Kael’s right shoulder, bursting it apart in blood and flesh, but he still refuses to let go. With his remaining arm, he holds Kavonok in place for one heartbeat more.
Kavonok’s amusement is giving way to irritation.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Persistent.</span>
</div>
He finally tears free and shoves Kael aside hard enough to send him crashing to the ground. As Kavonok turns back toward you, you act.
<<if _canSpark>>
You snap your fingers as you force yourself upright. A small white flame slips into being, quiet and almost insignificant, then crosses the distance to Kavonok in an instant. The lightest touch against his side is enough to set him ablaze.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">AAAH!</span>
</div>
For the first time, his voice loses its easy shape. He staggers as white fire races across cloth and skin faster than any natural flame.
Kavonok reacts quickly. One of his own men rushes close, and Kavonok seizes him by the throat, drags him into the fire, and forces the burning body against himself as a shield. The man’s screams barely last before Kavonok hurls the corpse aside and tears free of what remains of the flame, covered in blood, ash, and ruined flesh.
When he straightens, fresh burns mark his skin and his crude mask hangs broken, exposing the older scars beneath it. He laughs, though the fury in his eyes is harder to hide.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Hah! So you have tricks of your own. Amazing. No wonder the little fire-starter ran to you. With magicks like that, she’ll fit right in.</span>
</div>
<<else>>
You move before the pain can stop you. Gritting your teeth, you draw back one arm and drive your fist into his chest with everything you have left.
Something breaks. Kavonok is hurled backward into his own men hard enough to send bodies sprawling in every direction.
He stays down for a moment, then rises with a groan and one hand pressed to his ribs. A chuckle escapes him and turns into a cough. After rolling his neck, he looks at you with something close to genuine appreciation.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Strong bastard, aren’t you?</span>
</div>
<</if>>
Kavonok watches you sway on your feet, measuring what little each of you has left. A thin line of blood slips from the corner of his mouth. He touches it, then the wound near his collarbone, before glancing down at Kael’s dying body.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">A rat until the end, this one.</span>
</div>
He wipes the blood from his mouth. By the time he looks back at you, the casual smile has returned.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Well, it seems we’re both a bit worn out. Why don’t we leave this for another time?</span>
</div>
His smile widens.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">I’m sure we’ll have plenty of other fun things to show each other by then.</span>
</div>
He does not wait for an answer. At a small signal, his men begin to fall back, slow and disciplined, keeping their eyes on you and what remains of your tribe.
For now, they retreat, and the fighting ends.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_EyesInDaytime_Aftermath">>
<</button>>
</div>''<div class="hub-textbox">
The man before you is young, though there is something in his smile that makes the word feel wrong.
He is large, broad through the shoulders and thick with the kind of strength that seems effortless. Dark hair is braided back from his face. One side is hidden behind a rough, primitive mask strapped over an old burn wound, turning the disfigurement into something almost ornamental.
Fur hangs from his shoulders, while bone and carved trophies crowd his chest and belt. A spear with a strange, glowing violet tip rests lazily across his shoulders. Several half-rotted heads hang from his belt, swaying with each step.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">You must be $user, right? Heard a lot about you.</span>
</div>
He looks you over.
<<if $height < 190>>
His smile widens a fraction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Though you’re a bit shorter than I expected.</span>
</div>
<<else>>
His smile widens a fraction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">A large man. That’s good. A chieftain should be large.</span>
</div>
<</if>>
An unnatural silence settles over the camp, the last thing that should exist in the middle of a raid. Yet the raiders are the ones making the least noise.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">I prepared a little hunt for you earlier. I take it you enjoyed it? I even used one of my own concubines, just to be polite.</span>
</div>
He tilts his head, still smiling.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">You didn’t kill her after you were done, I hope. I was rather fond of her.</span>
</div>
There is no real concern in his voice. If anything, he sounds mildly curious.
When you remain silent, he sighs and scratches idly at the side of his head.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Not the talkative sort, then? That’s a shame. I had high expectations.</span>
</div>
His eyes wander lazily over you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Usually the chieftains of these little tribes either grovel or put on that proud, stoic look. It’s all very stale.</span>
</div>
You do not answer. You simply begin to close the distance.
He does not bother to move.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Straight to business, then? Alright. I’ll go first.</span>
</div>
Still casual, he reaches down to his belt, unhooks one of the heads hanging there, and tosses it at your feet.
It rolls through the dirt before coming to a stop. You know the face: one of the hunters who left with Kael on the scouting mission.
<<cgimg "images/events/ambush/head.png" "Amogus">>
Kavonok watches your eyes settle on the half-decomposed head.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Familiar, then?</span>
</div>
His tone remains light.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">He was one of the rats we found scurrying around our city. Though, to be fair to them, they were a little unlucky with their timing. I was just on my way out to pay you a visit when we stumbled over them.</span>
</div>
A whisper spreads through your people. Then a woman cries out. Kavonok pays it no mind and keeps watching you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Come now, don’t look at me like that, $user. What did you expect was going to happen?</span>
</div>
He gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">First you kill my men. Then you save little fire-starters and their weakling brothers. Then you send your own men creeping into my lands.</span>
</div>
He smiles again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">I had to answer.</span>
</div>
His eyes move briefly across the camp, almost as though he is searching for someone.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Oh—where is Halona, by the way? I did try to find her, bu—</span>
</div>
You move. One step, then another.
</div>''
<div class="hub-buttons">
<button class="js-slash-transition macro-button" data-slash-target="Event_Major_EyesInDaytime_Slash1" data-slash-mode="wound" data-slash-black-start="140" data-slash-switch="260" data-slash-black-hold="950" data-slash-fade-in="2000" data-slash-shake="110" data-slash-heartbeat="1" data-slash-heartbeat-delay="0">
<span class='choice-text'>Crush him</span>
</button>
</div><<silently>>
<<set $ambushChoice = null>>
/* Wisdom read: something is off */
<<set _ambushWisDC = 13>>
<<set _ambushWisRoll = random(1, 20)>>
<<set _ambushWisStat = setup.player.getStatForCheck("wisdom")>>
<<set _ambushWisTotal = _ambushWisStat + _ambushWisRoll>>
<<set $ambushWisCheck = {
ok: (_ambushWisTotal >= _ambushWisDC),
statKey: "wisdom",
stat: _ambushWisStat,
roll: _ambushWisRoll,
dc: _ambushWisDC,
total: _ambushWisTotal
}>>
/* Sway lock */
<<set _hasSway = !!($powersOwned and $powersOwned.sway)>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushWisCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $ambushWisCheck.total>> / <<print $ambushWisCheck.dc>></span>
</div>
</div>
You decide to pursue.
You burst into the woods with a speed few humans could match, cutting through brush and thicket as the distance between you and the watcher steadily closes.
At last, you see her clearly: a small, pretty woman, quick on her feet but not quick enough. She runs like someone desperate to escape, yet catching her feels almost too easy.
Within moments you are on her. You drive her to the ground and pin her before she can twist free. Wide, frightened eyes stare back at you.
She says nothing. Her only answer is quick, shallow breathing.
<<if $ambushWisCheck.ok>>
The closer look confirms what bothered you during the chase. She is no hunter and no true scout. She is too lightly built for a hard pursuit, too frightened, too unprepared. More importantly, if she truly meant to escape, she should never have let herself be seen so clearly in the first place.
This was not chance. She wanted you to follow.
Bait.
<</if>>
Whatever her purpose, she is under your control now. In the end, the strong rule and decide. Such is the law of nature.
So the question remains. What do you want to do?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Have retribution</span>">>
<<set $ambushChoice = "retribution">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<button "<span class='choice-text'>Ask questions</span>">>
<<set $ambushChoice = "questions">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<if _hasSway>>
<<button "<span class='choice-text'>Ask questions… persuasively</span>">>
<<set $ambushChoice = "sway">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="You have not acquired Sway.">
<span class="choice-text">Ask questions… persuasively</span>
</span>
<</if>>
<<if $ambushWisCheck.ok>>
<<button "<span class='choice-text'>Rush back to camp</span>">>
<<set $ambushChoice = "rush">>
<<goto "Event_Major_EyesInDaytime_RushBack">>
<</button>>
<</if>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Strength beat on first two raiders */
<<set _ambushStrDC = 13>>
<<set _ambushStrRoll = random(1, 20)>>
<<set _ambushStrStat = setup.player.getStatForCheck("strength")>>
<<set _ambushStrTotal = _ambushStrStat + _ambushStrRoll>>
<<set $ambushStrCheck = {
ok: (_ambushStrTotal >= _ambushStrDC),
statKey: "strength",
stat: _ambushStrStat,
roll: _ambushStrRoll,
dc: _ambushStrDC,
total: _ambushStrTotal
}>>
/* Casualties only apply once */
<<if !$questFlags["eyes_in_daytime_casualties_applied"]>>
<<set _lossDiv = (($ambushChoice is "retribution") or ($ambushChoice is "questions")) ? 3 : 4>>
<<set _popNow = Math.max(0, Number($pops ?? 0))>>
<<set _baseLoss = Math.ceil(_popNow / _lossDiv)>>
/* Failed strength check = +1 extra pop lost */
<<if not $ambushStrCheck.ok>>
<<set _baseLoss += 1>>
<</if>>
<<set $ambushPopLoss = Math.min(_popNow, _baseLoss)>>
<<set $pops = Math.max(0, _popNow - $ambushPopLoss)>>
<<set $questFlags["eyes_in_daytime_casualties_applied"] = true>>
<<else>>
<<set $ambushPopLoss = Number($ambushPopLoss ?? 0)>>
<</if>>
<</silently>>
<<run setup.playBattle && setup.playBattle()>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushStrCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Strength + d20 vs DC</span>
<span class="value"><<print $ambushStrCheck.total>> / <<print $ambushStrCheck.dc>></span>
</div>
</div>
When you return to camp, you return to slaughter.
Your men are either dead already or fighting for their lives. Women are dragged through the dirt by their hair, screaming, while others lie still among the bodies.
A little farther from the thickest fighting, several of the intruders look almost relaxed. One drags a struggling woman behind him while speaking to the others in a tone casual enough to sound like camp chatter.
<div class="dialogue-inset">
<span class="dialogue-speaker">Raider</span>
<span class="dialogue-line">They were lightly defended. Harder raiding those weaklings from NPCTribe 2 last seaso—</span>
</div>
There is no time to think. You seize the speaking man by the head.
<<if $ambushStrCheck.ok>>
For a second his skull holds. Then it bursts in your grip like overripe fruit. Before his companion can understand what he has seen, you drive the body into him hard enough to send them both crashing to the ground.
<<else>>
You wrench him off his feet and hurl him into his companion, sending both sprawling into the dirt. Before either can recover, your hand finds a fallen spear. In one motion, you drive it through the first man and into the second beneath him, pinning them both to the earth.
<</if>>
You do not spare the woman you just saved a glance. You are already moving toward the thickest fighting.
You hit the raiders at full speed and begin tearing through them. One lunges, and you break his arm before crushing his throat in your hand. Another tries to pull back and shout a warning, only for your weight to hit him hard enough to fold him into the mud. Spears splinter, blood soaks the trampled ground, and men die before they fully understand what is happening.
For a few savage moments, the attack falters. Your people rally where they can, and the raiders nearest you begin to give ground.
Then a voice drifts across the chaos, light and amused, as though its owner were interrupting a noisy meal rather than a massacre.
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Now, now. You’re all getting carried away.</span>
</div>
The fighting stutters. The raiders have not suddenly grown merciful; every one of them simply knows who has spoken, and none of them seems willing to disappoint him.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Turn to look</span>">>
<<goto "Event_Major_EyesInDaytime_Kavonok">>
<</button>>
</div><<silently>>
<<set _ambushEndDC = 13>>
<<set _ambushEndRoll = random(1, 20)>>
<<set _ambushEndStat = setup.player.getStatForCheck("endurance")>>
<<set _ambushEndTotal = _ambushEndStat + _ambushEndRoll>>
<<set $ambushEndCheck = {
ok: (_ambushEndTotal >= _ambushEndDC),
statKey: "endurance",
stat: _ambushEndStat,
roll: _ambushEndRoll,
dc: _ambushEndDC,
total: _ambushEndTotal
}>>
<<if not $ambushEndCheck.ok>>
<<set $endurance = Math.max(0, Number($endurance ?? 0) - 1)>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushEndCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $ambushEndCheck.total>> / <<print $ambushEndCheck.dc>></span>
</div>
<<if not $ambushEndCheck.ok>>
<div class="result-line bad">
<span class="label">Endurance lost</span>
<span class="value">-1</span>
</div>
<</if>>
</div>
Darkness takes you for a moment. When it clears, you are stumbling backward, breath caught in your throat.
You look at Kavonok. He has not moved, or at least you do not think he has. For one strange heartbeat, the world feels out of joint, as though something between you folded inward and snapped back into place.
Then you notice the wetness across your chest. Your hand comes away slick with blood.
You have seen your own blood before, but never this much, and never from a wound that did not immediately begin to close.
The spear should not have reached you from that distance, yet it did. The sensation is wrong, though. It feels less as though the weapon crossed the space between you and more as though the space itself gave way and let the strike happen.
<<if $ambushEndCheck.ok>>
The wound is not deep, yet your legs feel strangely unsteady, as though the cut stole more than flesh.
<<else>>
Standing becomes difficult at once. Your body wavers and the ground beneath you turns uncertain, but you force yourself to remain upright.
<</if>>
Kavonok studies you and lifts an eyebrow.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Hm? Still standing? That’s a first.</span>
</div>
His gaze drops to the glowing spearhead, now wet with your blood.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Maybe I should sharpen it...</span>
</div>
He tilts the spear slightly, inspecting its edge as though considering a kitchen knife. Then he looks back at you and smiles.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">...Well. Later.</span>
</div>
His grip shifts.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Let’s finish this.</span>
</div>
He shifts to strike again before he is even close enough to reach you.
</div>''
<div class="hub-buttons">
<button class="js-slash-transition macro-button" data-slash-target="Event_Major_EyesInDaytime_Slash2" data-slash-mode="wound" data-slash-black-start="140" data-slash-switch="260" data-slash-black-hold="600" data-slash-fade-in="1400" data-slash-shake="110">
<span class='choice-text'>A slash</span>
</button>
</div><<silently>>
<<run setup.stopHeartbeat && setup.stopHeartbeat()>>
<<run if (setup.bleedingOverlay) { setup.bleedingOverlay.soundSrc = "sounds/heartbeat.x1.5.mp3"; setup.bleedingOverlay.trackId = ""; }>>
<<run setup.playHeartbeat && setup.playHeartbeat({ restart: true })>>
<</silently>>
''<div class="hub-textbox">
Another strike lands, this time biting into your shoulder. You still cannot make sense of it, not with blood pouring from you and your thoughts slipping every time that glowing point moves.
Then Kavonok is standing directly in front of you. He is not looking at your face. His attention is fixed on the spear.
The violet light at its tip has grown brighter, fed by your blood until it almost seems alive.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Hmm. You’re a special thing, $user, aren’t you?</span>
</div>
His eyes remain fixed on the glow.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Last time I wanted it to shine like this, I had to feed it the blood of ten tribesmen.</span>
</div>
Only then does he look up at you again, smiling.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">With you, one stab does the same.</span>
</div>
His smile widens.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">I wonder what would happen if I took all of it.</span>
</div>
He tilts his head.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavonok</span>
<span class="dialogue-line">Let’s find out.</span>
</div>
You feel what is coming before he moves, and for the first time the fear is not simply of death. It is the fear of being emptied, of having body, thought, and self stripped away until nothing remains.
You brace for it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">KAVONOK!</span>
</div>
The shout cuts across the camp. Kavonok’s attention shifts at once, and he turns toward Halona almost lazily.
He smiles and opens his mouth, perhaps to say her name or offer whatever taunt is already waiting on his tongue, when something interrupts him.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>A stab</span>">>
<<goto "Event_Major_EyesInDaytime_KaelReturns">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
The trek back from patrolling the perimeter leaves you coated in a dry layer of grit and sweat. The moon hangs high and heavy, casting silver ribbons through the canopy as you veer off the main path toward the secluded sulfur spring.
The camp is silent behind you, the fires reduced to glowing embers, and you anticipate the rare luxury of washing the grime away in peace. But as you push through the ferns, the sound of splashing reaches your ears, accompanied not by the usual solitary scrubbing, but by soft, rhythmic gasps.
The steam rising from the water parts just enough to reveal two figures familiar to your gaze—women of your tribe. They are oblivious to your arrival, their attention entirely consumed by one another.
One sits on a smooth, mossy stone at the water's edge while the other stands between her parted knees, hands gliding over wet, glistening skin.
<<nsfwimgnew "images/events/female_love/scene0.png">>
Their movements are slow, exploratory, and utterly devoid of innocence. Fingers trace the curves of heavy, water-slicked breasts, and mouths find sensitive necks, drawing out whimpers that carry clearly in the night air.
</div>''
<div class="hub-buttons">
<<link "Get a closer look" "Event_Major_Female_Love_Threesome">><</link>>
<<link "Let them have their fun" "Event_Female_Love_Solo">><</link>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
You snap the deliberate quiet, your presence filling the small clearing like a sudden storm. They recoil, stumbling away from each other, faces draining of color.
To them, being caught like this by you is worse than a simple transgression; it is a sacrilege against the living embodiment of their strength. They cower, hands raised in a futile defense, breath hitching in terrified sobs as they await your judgment.
When no strike falls, confusion mixes with the fear. You merely step into the steaming water, letting your eyes rake over them with a heavy, possessive weight. The realization dawns slowly, then all at once: you are not here to smite them. The tension in their shoulders snaps, replaced by a glowing, almost religious relief. They aren't to be cast out; they are to be claimed.
The fear evaporates, transformed instantly into desperate, worshipful need. They scramble toward you, slipping on the slick stones in their haste. No thought is given to their own modesty now, only to the divinity of your form. Eager hands tear at the knots of your loincloth, trembling not from cold but from the sheer honor of being allowed to touch.
<<nsfwimgnew "images/events/female_love/scene_threesome1.png">>
Your cock springs free, and they fall upon it like starving believers offered a feast, the previous forbidden intimacy forgotten in the overwhelming desire to serve their chieftain.
<<nsfwimgnew "images/events/female_love/scene_threesome2.png">>
And serve they do.
</div>''
<div class="hub-buttons">
<<button "Let the night run its course.">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
A few days pass.
Monotonously.
Each day follows the same routine. You go to the wildling's tent, hold her down, and help Morag force the poultice down her throat. It is not that you do not understand her resistance. From the smell alone, it is easy to guess that the taste is nothing to savor.
Still, now on the fourth day, things are different.
Though she offers some token resistance, she is far more pliant than before, swallowing most of it without much trouble. And as you hold her, you cannot help but notice that her body no longer burns against yours the way it did before. The fever, it seems, has finally started to break.
When the last of the poultice is gone, Morag gives a satisfied grunt.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">There we go. Was that so hard? And with that, we are done. Within a few days, the spirits should be fully driven out.</span>
</div>
She turns to leave, but then pauses and glances back at the two of you, her eyes narrowing slightly as she takes in the position you are in.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">...And no straining physical activity for a few days either, hm? Do not get any ideas. There are already plenty of women in camp willing to answer your call, $user.</span>
</div>
She sighs, muttering something under her breath as she leaves the tent.
For your part, you let the wildling girl go.
This time, she rises more slowly, but without the same frantic desperation as before. She looks at you, and where once there had only been hostility, now there is something closer to curiosity.
You look back at her, and silence stretches between you.
Then she makes a few gestures with her hands, followed by a rough sound from her throat. To most, it would likely be incomprehensible.
But you understand the meaning well enough.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Wildling</span>
<span class="dialogue-line">Why help?</span>
</div>
The unspoken question lingers in the air.
You look at her for a moment, then begin to answer in your own tongue, trusting that she can understand your words almost as well as you can understand hers.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Because I did not want you to die</span>">>
<<goto "Event_Major_Fever_Love">>
<</button>>
<<button "<span class='choice-text'>Because you belong to me</span>">>
<<goto "Event_Major_Fever_Obedience">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set _wildlingLoveGain = 15>>
<<run setup.wildlingRoute.applyFeverChoice("love")>>
<</silently>>''<div class="hub-textbox">
She watches you closely, waiting.
You look at her for a moment, then speak plainly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">Because I did not want you to die.</span>
</div>
For the first time since Morag left, she goes completely still.
You could explain more. Lay out every reason that led you here, every thought that passed through your mind when you chose to help her. But there is no need to complicate something so simple.
Her gaze does not leave your face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">So I helped.</span>
</div>
You spread one hand slightly, as though the answer should be obvious.
The wildling's expression tightens at that, something uncertain passing across it. Suspicion. Confusion. Perhaps even the first faint hint of something else.
You do not press her.
Silence settles between you.
She does not respond, does not gesture, does not try to speak. She simply looks at you.
Then, after what feels like a very long time, she seems to abruptly lose interest. Turning away, she lowers herself onto the furs and lies down with her back to you.
You tilt your head slightly, watching her with a raised brow.
Her face remains turned from you, and yet, even as you continue standing there, she does not seem to mind your presence.
Still, after a while, you let out a quiet sigh and leave the tent, giving her the space to rest.
When the next day comes, however, something interesting becomes apparent.
The hunter assigned to guard her through the night and into the morning bears no fresh wounds, nor does he report any attempt to escape.
A small thing, perhaps.
But one worth remembering.
<div class="result-list">
<div class="result-line good">
<span class="label">New person</span>
<span class="value">The Wildling</span>
</div>
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print _wildlingLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let her rest.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set _wildlingObedienceGain = 15>>
<<run setup.wildlingRoute.applyFeverChoice("obedience")>>
<</silently>>''<div class="hub-textbox">
She watches you closely, as if weighing whether the answer matters at all.
You hold her gaze for a moment before answering.
You tell her it is because she is in your home now. Your tribe. She eats your food, breathes your air, lives beneath your shelter.
Because she is yours, as much as anything else here is.
Her brow furrows.
You take a slow step closer, not enough to corner her, but enough to make the meaning plain.
For a moment, her eyes harden, and you can almost see the anger flare back to life.
Good.
That, at least, means her strength is returning.
Then she signs again, sharper this time.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Wildling</span>
<span class="dialogue-line">Not yours.</span>
</div>
Her glare deepens at once, but you do not think your words fell on deaf ears. They landed somewhere within her, whether she likes it or not. Fertile ground may be too strong a phrase, but one way or another, she will remember what you said.
You do not answer her.
Instead, you turn and leave the tent. There is other work to be done, after all.
<div class="result-list">
<div class="result-line good">
<span class="label">New person</span>
<span class="value">The Wildling</span>
</div>
<div class="result-line good">
<span class="label">Obedience gained</span>
<span class="value">+<<print _wildlingObedienceGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let her think on it.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _data = setup.followersProposal.beginEvent()>>
<<set _canApprove = Number($goods ?? 0) >= 10>>
<</silently>>
''<div class="hub-textbox">
<h2>A Follower’s Proposal</h2>
<<if !_data>>
The proposal is withdrawn before it can reach you.
<<else>>
<b><<print _data.npcName>></b> comes to you before the day’s work has fully settled around the camp.
<<if _data.positionId is "huntmaster">>
They still smell faintly of game, smoke, and the wild paths beyond the camp.
<<else>>
They carry the scent of handled goods, counted stores, and the dust of a busy camp.
<</if>>
As your <b><<print _data.positionName>></b>, they have clearly spent some time thinking on the needs of the camp. Perhaps too much time, judging by the look in their eyes.
They carry with them a proposal. A change in how certain work should be handled. As you listen, it certainly sounds ambitious. If they manage to follow through, it could prove a real boon to the camp.
But ambition is one thing. Results are another.
The question now is whether you are willing to give them what they need to try.
<</if>>
</div>''
<div class="hub-buttons">
<<if _data>>
<<if _canApprove>>
<<button "Give the Go Ahead">>
<<if setup.followersProposal.setChoice("approve")>><<goto "Event_Major_FollowersProposal_Result">><</if>>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires at least 10 Goods">Give the Go Ahead — Requires 10 Goods</span>
<</if>>
<<button "Refuse">>
<<run setup.followersProposal.setChoice("refuse")>>
<<goto "Event_Major_FollowersProposal_Result">>
<</button>>
<<else>>
<<button "Return to your duties.">><<endMajorEvent>><</button>>
<</if>>
</div><<silently>>
<<set _result = setup.followersProposal.applyChoice()>>
<<set _data = _result ? _result.data : null>>
<</silently>>
''<div class="hub-textbox">
<h2>The Proposal’s Results</h2>
<<if !_result>>
The proposal comes to nothing.
<<elseif _result.choice is "refuse">>
You refuse.
<b><<print _data.npcName>></b> does not argue, though disappointment crosses their face before they can fully hide it.
They lower their gaze and accept your decision, if not with humility, at least with silence.
The proposal will go no further. At least not under <b><<print _data.npcName>>’s</b> guidance.
<b><<print _data.npcName>></b> excuses themselves soon after, leaving your tent with their pride a little bruised.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<elseif _result.success>>
The days that follow prove <b><<print _data.npcName>></b> was not speaking from empty ambition.
At first, the change seems small. A different way of organizing. A more deliberate use of goods. A few altered routines that some in the camp grumble about, but no one openly refuses.
Then the results begin to show.
Food comes in faster than expected. Less is wasted. More is preserved. What should have been a modest return becomes something far more useful, and even those who doubted the proposal find themselves quieter than before.
<b><<print _data.npcName>></b> does not boast in front of you, because they do not need to.
The camp has seen the worth of their idea, and you reap the benefits.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<else>>
The days that follow are not a complete disaster.
That, perhaps, is the kindest thing that can be said.
<b><<print _data.npcName>></b> throws themselves into the work, spending the goods you granted them and pushing the proposal as far as their abilities can carry it.
But ambition is not always enough.
Some food is gathered. Some small benefit is salvaged. Yet compared to what was promised, the result is thin.
<b><<print _data.npcName>></b> does their best to avoid you for a while after giving the report.
The camp gained a bit, still, but not nearly enough to justify what was spent in pursuit of it.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the results speak for themselves.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* EFFECT: spend 1/3 of stockpiled food, gain big morale (zeal + stability) */
<<set _foodNow = Number($food ?? 0)>>
<<set _spentFood = Math.floor(_foodNow / 3)>>
<<set $food = Math.max(0, _foodNow - _spentFood)>>
<<set $zeal = Number($zeal ?? 0) + 10>>
<<set $stability = Number($stability ?? 0) + 20>>
<</silently>>
''<div class="hub-textbox">
The stores are full—so full that restraint starts to feel like insult.
You make the call.
Fires are fed. Pots are kept boiling. Meat is handed out until hands stop shaking and mouths stop watching every bite. For one night, the camp eats with no worries about what tommorow brings.
The food stores empty out quickly. Its trading a season of assured security for a night of revelarly
<<nsfwimg "images/events/MajorFoodSurpulus/Dance1.gif">>
But the tribe celebrates. And chants your name
A third of what you have- gone into bellies, into laughter, into the kind of warmth that makes people remember why they follow you.
By morning, backs are straighter. Voices carry. Old grudges quiet down, if only because nobody wants to waste breath while the blood still feels rich.
This abundance might not last.
But the feeling will.
<div class="result-list">
<div class="result-line bad">
<span class="label">Spent</span>
<span class="value">-<<print _spentFood>> Food</span>
</div>
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">+10 Zeal, +20 Stability</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Enjoy it while it lasts.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
Something in the camp has begun to come undone.
Arguments no longer die with the fire. Oaths are repeated, but heard differently by different ears. Faith divides instead of binding.
People still look to you—
but not all for the same reason, and not with the same trust.
This is not collapse. Not yet.
But it is a split in the bone.
You can speak. Remind them what they are to one another— and what waits outside the ring of light.
Or you can let the tension burn until it becomes its own answer, and accept what it takes with it.
</div>''
<div class="hub-buttons">
<<button "Try to hold them together">>
<<set $frayingChoice = "hold">>
<<goto "Event_Major_FrayingBonds_Resolve">>
<</button>>
<<button "Accept the fracture">>
<<set $frayingChoice = "accept">>
<<goto "Event_Major_FrayingBonds_Resolve">>
<</button>>
</div><<silently>>
<<set _tn = 14>>
<<set _label = "Leadership & Charisma">>
<<set _roll = random(1,20)>>
<<set _stat = setup.player.getStatForCheck("leadership") + setup.player.getStatForCheck("charisma")>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _tn)>>
<</silently>>
''<div class="hub-textbox">
<<if $frayingChoice is "accept">>
You do not intervene.
<br><br>
You let the words spill and sour. You let the looks linger. You let small insults become habits.
<br><br>
The camp reorganizes itself without asking you.
<br><br>
Families close ranks. Friends become “ours” and “theirs.” Work still gets done—but now it is counted, weighed, remembered. A shared fire becomes a borrowed one.
<br><br>
Nobody riots. Nobody leaves in the night. But the tribe stops being one thing.
<br><br>
The ring of firelight still holds back the dark— yet inside it, people begin to watch each other as if the dark might be wearing familiar faces.
<br><br>
<div class="result-list">
<div class="result-line bad">
<span class="label">Choice</span>
<span class="value">Accept the fracture</span>
</div>
<div class="result-line bad">
<span class="label">End</span>
<span class="value">-1 Stability, -30 Resources</span>
</div>
</div>
<<else>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Speech</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Speech</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs TN</span>
<span class="value"><<print _total>> / <<print _tn>></span>
</div>
</div>
<br>
You step in—three paces, no more—close enough that everyone has to either meet your eyes or look away.
<br><br>
Not with a threat—threats are cheap, and everyone here has teeth.
<br><br>
You speak like you speak to a storm: steady, unblinking, naming what is true.
<br><br>
You remind them of the nights when hunger made beasts of men. You remind them who carried the wounded *to this very fire*. You remind them the world outside the light doesn’t care who was right in an argument.
<br><br>
You do not ask for love.
<br>
You demand function.
<br><br>
<<if _success>>
Your words do not heal the fracture.
<br><br>
But they stop it from splitting wide.
<br><br>
Someone looks away first. A jaw unclenches. A hand eases off a spearshaft. The loudest mouths quiet down—not out of shame, but because your voice has become the heaviest thing in arm’s reach.
<br><br>
People return to their tasks with less poison in their breath.
<br>
The fire holds a little longer.
<<else>>
Your words land wrong.
<br><br>
Some hear weakness and smell opportunity. Others hear accusation and feel pride flare hot.
<br><br>
Voices rise instead of settling—right there, right on top of you.
<br>
What was tension becomes personal—names spoken, old wrongs dragged up like bones.
<br><br>
Someone spits into the dirt a step from your boots. Someone else laughs—sharp and ugly.
<br><br>
For the first time in a long while, the tribe does not move as one body.
<br><br>
They break into corners, and the corners start to harden.
<</if>>
<br><br>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">+1 Stability</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">End</span>
<span class="value">-3 Stability, -3 Zeal, -2 Resources</span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the fire cool.">>
<<if $frayingChoice is "accept">>
<<set $stability = Number($stability ?? 0) - 1>>
<<set $resources = Math.max(0, Number($resources ?? 0) - 30)>>
<<else>>
<<if _success>>
<<set $stability = Number($stability ?? 0) + 1>>
<<else>>
<<set $stability = Number($stability ?? 0) - 3>>
<<set $zeal = Number($zeal ?? 0) - 3>>
<<set $resources = Math.max(0, Number($resources ?? 0) - 2)>>
<</if>>
<</if>>
<<unset $frayingChoice>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.playStars ? setup.playStars() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "stars";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<<npcAlive "npc_outcast_brother">>
<<set _brotherAlive = _npcAlive>>
<<npcAlive "npc_kael">>
<<set _kaelAlive = _npcAlive>>
<</silently>>
''<div class="hub-textbox">
It’s late at night, and you find yourself not quite ready to turn in. So, instead, you decide to take a walk around the camp.
<<if _kaelAlive>>
As you pass between the tents and fires, you spot Aedan, Kael’s eldest, leading a group of younger boys in a mock hunt, all loud whispers and exaggerated crouches. Nearby, their mothers watch with faint smiles, talking among themselves as they keep half an eye on the game.
<<else>>
As you pass between the tents and fires, you spot Aedan, Kael’s eldest. He sits somewhat apart from the other children, his gaze fixed on nothing in particular. Yet the absence of the usual childlike smile on his face only makes him look more like his father.
<</if>>
<<if _brotherAlive>>
You also notice that Tiksi, for his part, seems to have started acclimating. You can’t quite make out what he says, but a few of the men still awake seem amused by it, judging by the low chuckles that follow.
His sister, however, doesn’t seem to be anywhere in sight.
<</if>>
In the end, your steps carry you toward Halona’s tent, the exact reason why known only to you.
To your surprise, it stands empty.
Your curiosity stirred—and with nothing better to do—you decide to look for her.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Look for Halona</span>">>
<<goto "Event_Major_HeartToHeart_Search">>
<</button>>
</div>''<div class="hub-textbox">
You remain where you are for a moment, watching her beneath the stars.
Then, instead of sitting, you give a small shake of your head.
Halona studies you for a second, saying nothing. Whatever she reads in the gesture, she accepts it quickly enough. The faint softness that had touched her expression fades, though not entirely. What remains is quieter. More guarded.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I see,</span>
<span class="dialogue-bridge">She says.</span>
</div>
There is no anger in it. Only a note of disappointment she does not bother to hide all that well.
Her gaze drifts back upward, toward the countless lights overhead.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">They will still be there tomorrow,</span>
<span class="dialogue-bridge">She murmurs.</span>
<span class="dialogue-line">Assuming either of us cares to look.</span>
</div>
For a moment longer, you stand there in silence.
Then you turn back toward camp.
You can feel her eyes on your back for the first few steps, though when you glance over your shoulder, she is already looking skyward again—alone beneath the stars, with no one left to name them to.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave her to the stars.</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
It doesn’t take you long to realize that, for all your looking, the woman is nowhere to be found within the camp.
So you widen your search.
You pass beyond the camp’s perimeter and out into the quiet beyond. Out here, the sounds of the camp fall away, leaving only the hush of the night.
<<if $terrain is "forest">>
[Small descriptive text of the trees, earth, and distant animal sounds.]
<<elseif $terrain is "lake">>
[Small descriptive text of the water, damp ground, and the occasional ripple or call from the shore.]
<<elseif $terrain is "river">>
[Small descriptive text of the current, the wet stones, and reeds shifting in the dark.]
<<elseif $terrain is "mountain">>
[Small descriptive text of the cold air, stone underfoot, and the stillness of higher ground.]
<</if>>
After a while, you finally notice something in the distance.
A lone woman.
Beautiful. Familiar.
Halona sits on the ground with her knees drawn close, her gaze fixed somewhere far beyond the dark horizon—on something neither your eyes nor, perhaps, even hers can truly reach. On a home she can no longer return to.
You approach her slowly from behind.
She does not stir. Gives no sign that she has heard you.
And yet—
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Trouble sleeping, $user?</span>
</div>
Your brow lifts.
She recognized you without turning, without so much as a glance. Before you can ask how, she goes on, her voice quieter than usual, touched by a somberness you rarely hear from her.
She raises one hand and points toward the sky, toward the countless small lights scattered across it.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Timen,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">Stars.</span>
</div>
Her eyes stay on them.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">My people say they were there for our forefathers, and will still be there long after our grandchildren are gone. Guiding them through the darkness when they are lost. Leading them when they cannot find their own way.</span>
</div>
For a moment she says nothing more.
Then, softer:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Beautiful things, aren’t they?</span>
</div>
Only then does she shift, lowering her head slightly onto her knees before turning to look at you.
<<cgimg "images/events/hearttoheart/stars.png" "Halona beneath the night sky">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">What do you think, $user?</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>The stars are beautiful</span>">>
<<goto "Event_Major_HeartToHeart_StarsBeautiful">>
<</button>>
<<button "<span class='choice-text'>The stars are only lights</span>">>
<<goto "Event_Major_HeartToHeart_StarsOnlyLights">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["heart_to_heart_done"] = true>>
<<set $questFlags["heart_to_heart_outcome"] = "silent">>
<<set _removeIds = ["npc_outcast","npc_outcast_brother"]>>
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n && _removeIds.indexOf(String(n.id ?? "")) === -1)>>
<</if>>
<<if $people and $people.length>>
<<set $people = $people.filter(p => p && _removeIds.indexOf(String(p.id ?? "")) === -1)>>
<</if>>
<<if _removeIds.indexOf(String($activePersonId ?? "")) >= 0>><<set $activePersonId = null>><</if>>
<<if _removeIds.indexOf(String($selectedPersonId ?? "")) >= 0>><<set $selectedPersonId = null>><</if>>
<<if _removeIds.indexOf(String($personSelectedId ?? "")) >= 0>><<set $personSelectedId = null>><</if>>
<<if _removeIds.indexOf(String($personInfoId ?? "")) >= 0>><<set $personInfoId = null>><</if>>
<<for _i = 0; _i < _removeIds.length; _i++>>
<<set _pid = String(_removeIds[_i])>>
<<run setup.campPositions && setup.campPositions.removeNpcAssignments ? setup.campPositions.removeNpcAssignments(_pid) : null>>
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<</for>>
<</silently>>
''<div class="hub-textbox">
You say nothing.
For a moment, you simply hold her gaze.
Then your hand loosens around hers.
It is not a rejection. Not quite. But neither is it a plea for her to stay.
Halona watches your face for a long moment, as if searching it for something more—some firmer answer, some last sign that she ought to ignore what she just offered and remain anyway.
Whatever she finds there, it is not enough.
Something in her expression hardens, though not with anger. More like resignation. A quiet kind of hurt she refuses to let grow teeth.
Slowly, she withdraws her hand from yours and lowers her eyes.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I see,</span>
<span class="dialogue-bridge">She says.</span>
</div>
Her voice is steady again. Too steady.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<<if _npcAlive>>
<span class="dialogue-line">Then my brother and I will be gone by morning. It is better that way.</span>
<<else>>
<span class="dialogue-line">Then I will be gone by morning. It is better that way.</span>
<</if>>
</div>
She looks back out into the dark, toward the lake and the home that cast her out.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You have already done more than most would have. I will not ask for more.</span>
</div>
The night stretches quiet between you.
After a while, she draws in a slow breath and folds her arms over her knees once more, making herself smaller, more distant.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You should get some rest, $user.</span>
</div>
This time, there is nothing uncertain in it.
So, after one last look at her, you rise and leave her beneath the stars—alone with the dark, and with the choice you did not make.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave her with the night.</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<npcAlive "npc_outcast_brother">>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["halona_family_history_known"] = true>>
<</silently>>
''<div class="hub-textbox">
You oblige, sitting down beside her.
She tries not to show it, but the small smile that touches her lips is enough to tell you she is pleased you indulged her.
For the next hour or so, she speaks of the stars. She points out constellations, explains their meanings, and tells you how their alignments are read against the spirits. In time, you even coax her into speaking of her past.
She tells you of her grandmother, of her father, and of a time when, as a child, she swore she had spotted a spirit among the reeds by the lake—only for her grandmother to march over with a torch and reveal the “spirit” to be a half-drowned fisherman who had passed out face-first in the mud after too much drink. The memory earns the faintest huff of laughter from her, and when you answer with a joke of your own, you even manage to draw a real one from her.
But the laughter fades.
Silence follows, and from that silence the mood turns more subdued.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">...I suppose you’re curious,</span>
<span class="dialogue-bridge">She says at last.</span>
<span class="dialogue-line">About the life my brother and I led. About where we came from.</span>
</div>
Without waiting for your answer, she lifts a hand and points out across the dark, toward the same distant stretch she had been watching when you first found her.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Mishan—the city on the lake. Have you passed by it while moving camp?</span>
</div>
She asks the question, but does not seem to care whether you answer.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It was my brother’s home. Mine too. My father was its chief, and by right of assembly, my brother was meant to succeed him after his death.</span>
</div>
Her hand lowers slowly. You notice her fingers curl in against her palm.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But a viper hiding its fangs cast us out of our own nest.</span>
</div>
The contempt in her voice is unmistakable now.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Kavonok calls himself chieftain now. He rules there as both lord and usurper—a man more interested in killing and pillaging than ruling.</span>
</div>
She exhales, unclenching her fist, then turns her eyes up toward you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I am not telling you this because I want revenge done in my name. Or in my brother’s.</span>
<span class="dialogue-bridge">She pauses.</span>
<span class="dialogue-line">I am telling you because you should know what kind of man lives by that lake.</span>
</div>
Her hand tightens slightly where it rests against yours.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">If you continue to call these lands home, it is only a matter of time before he takes notice.</span>
<span class="dialogue-bridge">Her voice grows quieter.</span>
<span class="dialogue-line">And sooner still if he learns you are sheltering us.</span>
</div>
For a moment she says nothing.
Then, with a firmness that sounds almost rehearsed, she adds:
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<<if _npcAlive>>
<span class="dialogue-line">If you want, my brother and I will leave tomorrow. We have already brought enough danger to the people who helped us.</span>
<<else>>
<span class="dialogue-line">If you want, I will leave tomorrow. I have already brought enough danger to the people who helped me.</span>
<</if>>
</div>
Her grip tightens once more.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">To you.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Urge her to stay</span>">>
<<goto "Event_Major_HeartToHeart_UrgeStay">>
<</button>>
<<button "<span class='choice-text'>Say nothing</span>">>
<<goto "Event_Major_HeartToHeart_Silent">>
<</button>>
</div>''<div class="hub-textbox">
You nod and agree with her. Indeed, the stars serve a noble purpose. To guide those who would otherwise be left blind in the dark—made only grander by the beauty of their light. Could there be a finer purpose?
She listens to your answer, her dark eyes fixed on you as she turns your words over in her mind.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">And what becomes of those who never learn to walk without them?</span>
<span class="dialogue-bridge">She asks at last.</span>
<span class="dialogue-line">A guiding light is a fine thing. But if people grow too used to following it, they forget how to find their own way.</span>
</div>
After a moment of silence, she adds,
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">...I always thought they looked lonely.</span>
</div>
Then, after another stretch of quiet, she finally rises and looks at you again. With a small motion of her hand, she taps the ground beside her.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Sit with me, $user. Whatever you think of the stars, they are still worth knowing.</span>
</div>
Her gaze flicks upward again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Let me show you the alignments my grandmother taught me.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sit with her</span>">>
<<goto "Event_Major_HeartToHeart_Sit">>
<</button>>
<<button "<span class='choice-text'>Go back to camp</span>">>
<<goto "Event_Major_HeartToHeart_GoBack">>
<</button>>
</div>''<div class="hub-textbox">
You disagree with her. True, the stars cast light enough to guide those beneath them, but that does not make guidance their purpose. They shine for reasons of their own. That men happen to find their way by them is only an aftereffect.
She listens to your answer, her dark eyes boring into you as she digests what you’ve said.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So you think the lights in the sky shine only because they were made to shine?</span>
<span class="dialogue-bridge">She asks.</span>
<span class="dialogue-line">That would be a sad thing, if it were true.</span>
</div>
She turns her gaze back to the sky.
After a moment of silence, she adds,
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">...I always thought they looked lonely.</span>
</div>
Then, after another stretch of quiet, she finally rises and looks at you again. With a small motion of her hand, she taps the ground beside her.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Sit with me, $user. Whatever you think of the stars, they are still worth knowing.</span>
</div>
Her gaze flicks upward again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Let me show you the alignments my grandmother taught me.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sit with her</span>">>
<<goto "Event_Major_HeartToHeart_Sit">>
<</button>>
<<button "<span class='choice-text'>Go back to camp</span>">>
<<goto "Event_Major_HeartToHeart_GoBack">>
<</button>>
</div>''<div class="hub-textbox">
The moonlight turns Halona’s skin into pale marble. She pulls you down, her hands shaking where they grip your shoulders, and kisses you again. It is soft this time, her lips parting easily to let you in, tasting of mint and night air.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I still think you're an idiot,</span>
<span class="dialogue-bridge">She whispers against your mouth, but she is smiling just a little.</span>
</div>
She lies back in the tall grass, the silver blades bending around her body like a cage. She pulls her tunic up, exposing herself to the cool night wind. Her stomach tenses at the chill, flushing pink. Her legs part slowly, an offering.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Come here.</span>
</div>
You settle over her, the heat of your body chasing away the goosebumps on her arms. You reach down, thumbs hooking into the waist of her leggings to drag them down. She lifts her hips to help, kicking them away. Her cunt is bare to you, a small, tight slit glistening with wetness, hidden under a dark patch of hair.
She gasps as you touch her, her back arching off the ground.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It's... different when you touch me.</span>
</div>
You line your cock up with her entrance. The head pushes against her folds, spreading them. She is impossibly small, the hole barely a bud that resists your intrusion.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Wait,</span>
<span class="dialogue-bridge">She breathes, her hands flying to your forearms. Her eyes seek yours, wide and dark in the pale light.</span>
<span class="dialogue-line">Just... go slow.</span>
</div>
You push forward. The resistance is immediate and absolute. Her body fights you, muscles clamping down in panic. You feel the barrier of her hymen, a thin wall of tissue blocking the way.
She bites her lip, a small whimper escaping her throat.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don't stop. I want this. I want you.</span>
</div>
<<nsfwimgnew "images/events/hearttoheart/sex.png">>
You press harder. The tissue stretches, taut and stinging, before it tears. A sharp cry tears from her throat, and she digs her nails into your skin, drawing blood. You slide in an inch, the sudden heat gripping you like a burning fist.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Gods,</span>
<span class="dialogue-bridge">She gasps, her head thrown back.</span>
<span class="dialogue-line">You're... you're splitting me open.</span>
</div>
You still, giving her time to adjust. The pulse of her heart beats against your shaft where you are buried inside her. She feels like liquid fire, scorching hot and incredibly tight. Sweat beads on her forehead.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Move,</span>
<span class="dialogue-bridge">She says after a moment, her voice strained.</span>
<span class="dialogue-line">Please. I want to feel all of you.</span>
</div>
You sink deeper, burying yourself to the hilt in one slow, relentless thrust. She cries out again, the sound raw and unguarded, but this time she rocks her hips up to meet you, accepting the pain as the price of this connection.
You begin to move. There is no rush. You pull out until only the head remains inside her, then push back in, dragging a moan from her lips. Every stroke sends a fresh wave of sensation through her body, making her toes curl in the grass.
She wraps her legs around your waist, pulling you tight against her. She stares up at you, her eyes glassy with tears of pain and pleasure, completely focused on your face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don't look away,</span>
<span class="dialogue-bridge">She commands softly.</span>
</div>
She lifts her head to kiss you, sloppy and wet, her tongue tangling with yours. You can taste the salt of her tears. Her inner walls ripple around your cock, squeezing you rhythmically, massaging your length as you take her.
The friction builds, a slow burn that starts in your groin and spreads outward. Her cunt is swollen and sensitive, every ridge and vein of your cock rubbing against her untouched places.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I can feel... it,</span>
<span class="dialogue-bridge">She whimpers, breaking the kiss to gasp for air.</span>
<span class="dialogue-line">Something is happening.</span>
</div>
Her body seizes up. Her thighs clamp around your ribs, trapping you. Her pussy convulses violently, a series of hard, clamping spasms that milk your shaft. She screams, her nails raking down your back, as her orgasm crashes over her.
The sensation is too much. You groan, burying your face in her neck, and let go. Your cock pulses, thick streams of cum filling her up. You pump her full of your seed, the heat of it mixing with her own fluids.
She shudders beneath you, her body relaxing bonelessly into the grass. You stay inside her, softening but still connected, neither of you willing to break the seal. The wind rustles the grass around you, cooling the sweat on your skin.
She strokes your hair, her fingers gentle.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I meant it,</span>
<span class="dialogue-bridge">She whispers into the darkness.</span>
<span class="dialogue-line">I hate that I care.</span>
</div>
She says it into the dark, so quietly that for a moment it almost feels like something meant only for herself.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_HeartToHeart_TumbleEnd">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["heart_to_heart_done"] = true>>
<<set $questFlags["heart_to_heart_outcome"] = "stay">>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 15;
setup.people.grantSpecialTrait(h, "foreignRites");
V.halonaLoveGain = 15;
})();>>
<</silently>>
''<div class="hub-textbox">
You lift your head and look at her.
The moon catches in her eyes, in the damp lashes, in the loose strands of black hair stuck to her cheeks. She looks exhausted. Softened, in a way you have never seen from her before. But when she notices you watching, some small remnant of defiance returns to her mouth.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t look so pleased with yourself,</span>
<span class="dialogue-bridge">She murmurs, though there is no strength in it.</span>
</div>
You shift, easing your weight off her at last, and the night air rushes cool against sweat-warmed skin. For a moment neither of you moves. The grass whispers around you. Somewhere in the dark, an insect chirrs. The camp beyond feels far away.
Then Halona tries to sit up.
She makes it halfway before a sharp breath catches in her throat and her hand shoots to your arm.
You say nothing. You simply slide one arm beneath her back and the other under her legs, and lift her from the grass.
She stiffens at once.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I can walk,</span>
<span class="dialogue-bridge">She mutters.</span>
</div>
Maybe she even believes it.
Still, she does not fight you.
She only folds in closer after a moment, one hand clutching at your shoulder while the other gathers her tunic around herself. Her face turns slightly into your neck, whether to hide the flush still lingering there or simply to avoid your eyes, you cannot tell.
You carry her back in silence.
The camp is quieter now, most fires burned low, most voices long gone. By the time you reach her tent, her grip on you has loosened. Sleep pulls at her in spite of herself.
When you lower her gently onto her bedding, she catches your wrist before you can pull away.
Her eyes open just enough to find yours.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You are still an arrogant fool,</span>
<span class="dialogue-bridge">She whispers.</span>
</div>
Then, after the smallest pause:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But stay. Just until I fall asleep.</span>
</div>
And stay you do.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
<div class="result-line good">
<span class="label">Special Trait Unlocked</span>
<span class="value">Foreign Rites</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Stay a little longer.</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
You say nothing at first. You simply look at her.
Then you shift where you sit and take her firmly by the shoulders, turning her toward you. Your $eyes eyes meet hers, unblinking.
For a moment, you still say nothing.
Then, at last, you give her something simple. Something firm.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">Stay.</span>
</div>
You tell her that you are powerful. That you are wise. That you are capable of things other men can scarcely imagine. You tell her she is safe with you. That her place is here.
She listens in silence. Whatever your words stir in her, she tries to hide it by turning her head aside, breaking eye contact—perhaps hoping to hide the faint wetness gathering in her eyes.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You are an arrogant fool.</span>
<<if $height < 160>>
<span class="dialogue-line">And a short, stubborn one.</span>
<<elseif $height > 190>>
<span class="dialogue-line">And a great lumbering oaf on top of it.</span>
<<else>>
<span class="dialogue-line">And a stubborn one, besides.</span>
<</if>>
</div>
Then, suddenly, she looks back at you.
And before you can say anything else, she presses her lips against yours.
When she finally breaks the kiss, she is a little breathless.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">And I hate that I care for you.</span>
</div>
Then she kisses you again.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return her kiss</span>">>
<<goto "Event_Major_HeartToHeart_Tumble">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
The sun bleeds out over the horizon as you make your way back to the flickering fires of the camp, a brace of rabbits slung over your shoulder. Your mind is on the warmth of the hearth and the promise of a hot meal, but something on the path ahead gives you pause.
It's not the familiar, heavy print of your tribe's hunters, nor the broad, splayed tracks of the foragers. These are lighter, smaller, and strangely numerous.
They are barefoot, but the impressions are shallow, made by people who move with a hesitant, shuffling gait, as if carrying precious things with unfamiliar care. They lead away from the path, disappearing into the deepening shadows of the woods.
</div>''
<div class="hub-buttons">
<<link "Follow the strange tracks (Wisdom check)" "Event_SmallTracks_Investigate">><</link>>
<<link "Shrug it off. The wilds are full of mysteries.">>
<<endMajorEvent>>
<</link>>
</div><<silently>>
<<set _quest = setup.hollowHill.beginQuest()>>
<</silently>>
''<div class="hub-textbox">
<div><b>The Hollow Hill</b></div><br>
The scouts return from the mountain with news of a strange sighting.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Scout</span>
<span class="dialogue-line">"A... hole. Half-hidden!"</span>
</div>
One says it excitedly.
It takes a while for them to explain what exactly they found.
Not just a naturally formed cave, per se.
They found it half-hidden behind a tumble of stone and scrub, where a narrow opening cuts into the mountainside. The rock around it is too straight in places, its edges broken but unmistakably worked.
Inside, the passage descends into darkness.
Old timber lies beneath the rubble. Most of it crumbles beneath a hand, blackened by age and damp, but enough remains to show that someone once braced the stone deliberately.
Farther in, they found metal.
Not much.
A rusted length of chain. The broken head of some heavy tool. A bent fitting buried beneath loose stone.
Things no one among your tribe could make.
Then the passage ended.
A great collapse fills the tunnel from wall to wall.
Beyond it, cold air still finds a way through.
Whatever lies inside the mountain has been sealed away for a very long time.
Perhaps not completely.
<div class="result-list">
<div class="result-line good"><span class="label">Task added</span><span class="value">The Hollow Hill</span></div>
<div class="result-line"><span class="label">Objective</span><span class="value">Investigate the ancient opening discovered inside the mountain.</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Investigate the opening.">><<endMajorEvent>><</button>>
</div>''<div class="hub-textbox">
<p>It has been a while since you hunted alone. With the tribe finally secure enough in this new region that every absence does not feel like a risk, you allow yourself the indulgence.</p>
<p>Not because the camp needs meat. Not because anyone asked you to go.</p>
<p>You want to test yourself.</p>
<p>You leave before most of the camp wakes, carrying only your spear into the trees. Cold air settles against your skin. Damp earth gives beneath your feet. Somewhere farther off, hidden animals call to one another through the morning quiet.</p>
<p>As you move deeper into the forest, that familiar sense returns. Something about you is not normal.</p>
<<silently>>
/* Fix spelling + ensure numeric compares */
<<set _str = setup.player.getStatForCheck("strength")>>
<<set _wis = setup.player.getStatForCheck("wisdom")>>
/* If equal, randomly pick which "feel" you get */
<<set _huntRoll = 0>>
<<if _str is _wis>>
<<set _huntRoll = random(1,2)>>
<</if>>
<</silently>>
<<if (_str > _wis) or ((_str is _wis) and (_huntRoll is 1))>>
<p>Once again, your body feels almost offensively capable.</p>
<p>You move faster than the terrain should allow. Roots and brush that would slow another hunter barely register beneath your feet. Animals catch your scent and bolt, but distance does not save them. You keep pace through the trees with an ease that still feels wrong when you stop to think about it.</p>
<p>A boar bursts from a thicket ahead, broad through the shoulders and angry enough to charge rather than run.</p>
<p>You meet it head-on.</p>
<p>Your spear drives into its skull with almost no resistance. The animal drops immediately.</p>
<p>The shaft snaps in your hands.</p>
<p>For a moment you stare at the broken wood. The boar did not break it. You did. The force of your own thrust was more than stone and timber could bear.</p>
<p>You let the useless half of the weapon fall and flex your hand. Your fingers ache faintly, not from effort but from the reminder that even when you think you are holding back, apparently you are not holding back enough.</p>
<<else>>
<p>Once again, the forest seems sharper than it did before.</p>
<p>Not because your eyes have changed, exactly. You simply notice more.</p>
<p>A bent blade of grass. Soil disturbed at the edge of a game trail. Mud smeared against bark where something passed too close. Details that an experienced hunter might need minutes to piece together arrange themselves into a pattern almost as soon as you see them.</p>
<p>That pattern leads you to a boar.</p>
<p>It is a large one, the sort of animal that can end a hunt with one bad step. You find the churned earth where it rooted, then the deep prints where it turned through the brush. By the time you finally see it, you already know how it will approach.</p>
<p>The boar paws the ground and charges.</p>
<p>You wait until the last possible moment, then move just far enough aside to let its own momentum betray it. Your spear comes up beneath the jaw, into the narrow place where muscle and bone offer less protection.</p>
<p>One thrust is enough.</p>
<p>The boar crashes past you, stumbles, and collapses. It kicks twice before going still.</p>
<p>You stand over it with your breathing barely changed. There was no contest of strength. By the time it charged, the outcome had already been decided.</p>
<</if>>
<p>You take your time afterward, cleaning the worst of the blood from your hands and arms with wet grass and moss.</p>
<p>Then you hook your arms beneath the boar and lift it onto your shoulder.</p>
<p>It is heavy. You can feel the weight of it.</p>
<p>It simply does not feel heavy enough to matter.</p>
<p>You turn toward camp, already thinking about meat, fat, hide, and bone, when something catches around your ankle.</p>
<p>Not mud. Not a root.</p>
<p>A cord.</p>
<p>It tightens for only a fraction of a second before something hidden in the brush answers with a sharp mechanical pull.</p>
<p>The ground shifts. Leaves tremble ahead.</p>
<p>Then comes a small, unmistakable click from somewhere you cannot see.</p>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Its a trap!</span>">>
<<goto "Event_Major_ItsATrap_1">>
<</link>>
</div><<silently>>
/* Numeric-safe */
<<set _end = setup.player.getStatForCheck("endurance")>>
<<set _hasSpark = !!($powersOwned and $powersOwned.spark)>>
<</silently>>
''<div class="hub-textbox">
<p>The snare closes around your ankle with a clever jerk, cord biting down as the mechanism turns tension and leverage into force.</p>
<p>For a brief moment, you almost admire the construction.</p>
<p>Against someone else, it would have hurt considerably more.</p>
<<if _end < 5>>
<p>The cord cuts a shallow wound. Blood beads along the skin before slowing almost immediately. Annoying, but little more than that.</p>
<<else>>
<p>The cord leaves little more than a scratch, if even that.</p>
<</if>>
<p>You do not panic or waste strength fighting the snare. Instead you follow the tension with your hands, find the knot and the hidden point holding the mechanism together, and break its bite with two quick movements.</p>
<p>Then you stop moving.</p>
<p>You listen.</p>
<p>At first there is only wind in the branches and the distant noise of birds. Still, your attention keeps returning to the same patch of brush. Something about its shape is wrong.</p>
<p>Whoever is hiding there is good at it.</p>
<p>Very good.</p>
<p>You let your posture loosen and turn your gaze elsewhere, giving every appearance that the trap itself has become the only thing worth your attention.</p>
<p>Then you act.</p>
<<if _hasSpark>>
<p>A narrow white flame gathers in your palm. You keep it small and controlled, then flick it toward the brush as casually as a thrown pebble.</p>
<p>The leaves flash with pale light.</p>
<p>A heartbeat later, someone bursts from cover, stumbling into the open while frantic hands slap at clothes and skin in search of fire that never quite catches.</p>
<<else>>
<p>You crouch beside the ruined snare and pretend to study it. After a moment you pick up a stone.</p>
<p>Your arm barely seems to move.</p>
<p>The stone strikes the tree beside the hidden figure with a heavy crack, bites into the bark, then ricochets through the brush. Something inside gives a sharp hiss of pain.</p>
<p>A figure jumps from cover.</p>
<</if>>
<img src="images/events/ItsATrap/Wildling.png" alt="Amogus">
<p>To your surprise, the trapper is a woman.</p>
<p>Filth and grime streak her skin, but they do little to hide sharp features and a lean, hardened body. She remains low to the ground, half-crouched and ready to spring. There is no wounded pride in the posture, only the immediate calculation of an animal deciding whether escape or attack offers the better chance of survival.</p>
<p>She makes the same sound again, somewhere between a hiss and a growl.</p>
<p>It is not language. Not quite.</p>
<p>Even so, some instinctive part of you understands the meaning behind it.</p>
<p>Stay back. Try me and I will bite.</p>
<p>The warning would have been clear even without your strange gift.</p>
<p>Now you have to decide what to do with her.</p>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Attack her</span>">>
<<goto "ItsATrap_Attack">>
<</link>>
<<link "<span class='choice-text'>Calm her</span>">>
<<goto "ItsATrap_Calm">>
<</link>>
</div>''<div class="hub-textbox">
Kael does not answer immediately. He keeps looking into the distance for a few moments before finally exhaling.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">It’s nothing.</span>
</div>
The answer comes in his usual even tone, but after a short pause he shakes his head.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">No. That would be a lie.</span>
</div>
Only then does he turn to face you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I can’t stop thinking about that tribe by the lake, the one those displaced hunters spoke of.</span>
</div>
His eyes hold yours for a moment before drifting back toward the horizon.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">If it were only that, I wouldn’t be troubled. Small tribes are swallowed by larger, stronger ones all the time. That is the way of things.</span>
</div>
His expression remains unchanged.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">But the way their old chieftain spoke of them... It didn’t sound like some passing raid. It sounded common and expected, as though they claimed the whole region by right and pushed everyone else out.</span>
</div>
Kael folds his arms.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">That is what troubles me.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Any plans?</span>">>
<<goto "Event_Major_KaelScout_Plans">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["kael_scout_departed"] = true>>
<<set _pid = "npc_kael">>
<<run setup.campPositions && setup.campPositions.removeNpcAssignments ? setup.campPositions.removeNpcAssignments(_pid) : null>>
/* Remove from CAMP NPC list */
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n and n.id !== _pid)>>
<</if>>
/* Remove from generic people list */
<<if $people and $people.length>>
<<set $people = $people.filter(p => p and p.id !== _pid)>>
<</if>>
/* Clear selection only if it points to him */
<<if $activePersonId is _pid>><<set $activePersonId = null>><</if>>
<<if $selectedPersonId is _pid>><<set $selectedPersonId = null>><</if>>
<<if $personSelectedId is _pid>><<set $personSelectedId = null>><</if>>
<<if $personInfoId is _pid>><<set $personInfoId = null>><</if>>
/* Clear talk/menu state safely */
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<</silently>>
''<div class="hub-textbox">
At your nod, Kael lets out a quiet sigh.
His gaze shifts toward Aedan. The boy is helping the women alongside the other children, trying very hard to look useful.
Then Kael looks back to you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Well then. I’ll go see to the preparations, Chieftain.</span>
</div>
He turns to leave, but stops after only a step or two. When he speaks again, there is a rare note of concern in his voice.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Take care of yourself, $user. Alright?</span>
</div>
Then he walks off.
<<if $mishanFirstContactRoute is "outcast_hostile">>
You watch him go for a moment before turning away. There is translation work waiting for you, after all.
<<else>>
You watch him go for a moment before turning away.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let Kael make ready.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$mishanFirstContactRoute>>
<<set $mishanFirstContactRoute = (setup.campNpcs and setup.campNpcs.has and setup.campNpcs.has("npc_outcast")) ? "outcast_hostile" : "peaceful">>
<</if>>
<</silently>>
''<div class="hub-textbox">
Kael nods almost immediately and turns toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">A simple one. I’ll gather some men first.</span>
</div>
<<if $mishanFirstContactRoute is "outcast_hostile">>
He tips his head toward Halona’s tent.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Then I’ll speak with the outcast girl and get what directions I can. Or rather... I’ll have you do the speaking, if you don’t mind, Chieftain. She seems quick enough, but neither she nor I have quite managed to get past the language barrier.</span>
</div>
<<else>>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We know they’re somewhere near the great lake. The displaced hunters gave us enough to start with.</span>
</div>
<</if>>
His gaze returns to the distance.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Then the men and I will go and have a look at our neighbors.</span>
</div>
After a brief pause, he adds:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">From a distance, for now.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Nod</span>">>
<<goto "Event_Major_KaelScout_Departure">>
<</button>>
</div>''<div class="hub-textbox">
It is well into the night when you notice the light still burning near Kael's shelter.
Most of the camp has long since settled. Fires have burned down to dull orange beds, voices have faded, and only the occasional movement of a guard or rustle of hide breaks the quiet. Kael, however, is still awake.
You find him seated near a low fire with several scraps of hide spread around him. Charcoal marks cover most of them. Rough lines for the great lake. Marks for your camp. Others farther east. Arrows cross between them in different directions, some ending abruptly beneath heavy black strokes where he has clearly abandoned one thought and moved to another.
He looks up when you approach.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Couldn't sleep.</span>
</div>
Your eyes drift over the scattered plans.
Kael follows your gaze and gives a tired little snort.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Not because I'm worried, before you ask.</span>
</div>
He rubs at one eye with the heel of his hand before reaching for another piece of charcoal.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I keep thinking there has to be something obvious I'm missing.</span>
</div>
He adds another line to one of the hides, studies it for several seconds, then scratches the whole thing out.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">...</span>
</div>
You settle nearby.
For a while, neither of you says much. Kael moves between the scraps in front of him, occasionally adding a mark or striking one away. Eventually you ask why he is doing this outside rather than in his own shelter.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">My woman told me that if I insist on spending half the night doing this, I can at least do it somewhere she doesn't have to listen to me moving around.</span>
</div>
There is the faintest trace of amusement in his voice, easy to miss if you do not know him well.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">She's pregnant again. So I'm told I should be making her life easier.</span>
</div>
He glances toward the darkened camp, then back to the hides.
The subject passes almost as quickly as it came.
Kael leans forward, forearms resting against his knees, apparently content to return to his thoughts. You let the silence sit for a little longer before asking what is actually troubling him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We don't know how many men Kavnok can bring if he decides he wants us gone. We don't know how quickly he can gather them. We don't know which tribes near the lake answer to him, where their resources come from, or how firm his grip on the city really is.</span>
</div>
His finger moves across another set of marks.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I don't know where they keep most of their food. I don't know who carries messages between their settlements. I don't know how much of what we saw was Kavnok showing off and how much was normal for them.</span>
</div>
He sits back.
There is frustration in his expression, but no panic.
You tell him to speak plainly. If the Mishan have to be dealt with, what course of action does he think is most likely to succeed?
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Right now, I could give you ten plans.</span>
</div>
He gestures toward the scattered hides.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I wouldn't trust any of them.</span>
</div>
You ask what would change that.
His answer comes immediately.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Knowing more.</span>
</div>
He picks up the charcoal again, turning it slowly between his fingers.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Numbers. Roads. Stores. Who they trust. Who hates them. What they do when something interrupts their usual routine. Who might be willing to open the gates from the inside.</span>
</div>
His eyes settle on you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Anything that means I'm working with facts instead of guesses.</span>
</div>
He looks back toward the rough shape of the lake, then begins gathering some of the abandoned plans into a loose pile.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">For now, that's the best answer I have.</span>
</div>
A pause follows.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">When I have something I trust, I'll come to you.</span>
</div>
He reaches for the nearest scrap of hide again.
You glance at him.
Kael notices.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">It's a long night. There's still some broth by the fire. Want some?</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sure. I'd like that.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_many_hands_no_master") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _state = setup.traditionEvents.ensureManyHandsNoMasterState(_entry)>>
<<set _charismaDc = _state and _state.levelId is "unbound" ? 10 : 14>>
<<set _leadershipDc = _state and _state.levelId is "unbound" ? 10 : 8>>
<</silently>>
''<div class="hub-textbox">
<<if _state and _state.materialType is "food">>
<br>
The problem makes itself known near the drying racks.
Several baskets sit where they were dropped, still heavy with roots, berries, and the remains of the morning’s hunt. Some of the meat has been cut apart, but much of it remains untouched. Flies already gather around the exposed flesh while the sun slowly climbs overhead.
There are more than enough hands nearby. That does not seem to matter.
The hunters insist that carrying the food back was their part. Those who usually tend the fires claim they have their own work. Others argue over which meat should be dried first, each suggestion answered by a demand to know why anyone should listen.
No one wishes to be the first person ordered by someone with no right to give orders.
<<elseif _state>>
<div><b>Many Hands, No Master</b></div><br>
The problem makes itself known near the centre of camp.
Wood, stone, hides, and lengths of cord have been left in several uneven piles. Some were meant for damaged shelters. Others were gathered for new racks, tools, and the countless small repairs the camp always seems to need.
There are more than enough hands nearby. Yet that does not seem to matter in this case.
One follower begins sorting the wood, only to stop when no one joins them. Another points toward a sagging shelter and insists it should come first. When someone tries to direct the others, the response is immediate: why should any of them answer to someone who holds no authority over them?
No one refuses to work outright. Everyone merely waits for someone else to begin, or for everyone else to accept their way of doing it.
<<else>>
The matter before the camp can no longer be recovered safely.
<</if>>
</div>''
<<if _state>><div class="hub-buttons">
<<button "Draw willing hands together.">><<set _state.option = "charisma">><<goto "Event_Major_ManyHandsNoMaster_Charisma">><</button>>
<<button "Leave them to their own ways.">><<set _state.option = "autonomy">><<goto "Event_Major_ManyHandsNoMaster_Autonomy">><</button>>
<<button "Put one of them in charge.">><<set _state.option = "order">><<goto "Event_Major_ManyHandsNoMaster_Order">><</button>>
</div><<else>><div class="hub-buttons"><<button "Return to your duties.">><<endMajorEvent>><</button>></div><</if>><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_many_hands_no_master") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _state = setup.traditionEvents.ensureManyHandsNoMasterState(_entry)>>
<<if _state and !_state.applied>><<set _state.option = "autonomy">><<set _state = setup.traditionEvents.applyManyHandsNoMasterOutcome(_entry, "autonomy")>><</if>>
<</silently>>
''<div class="hub-textbox">
You withdraw your attention from the dispute.
No command enters their minds. No chosen follower receives your favour. Whatever happens here will be decided by those whose hands must perform the work.
<<if _state and _state.outcome is "good">>
For a time, nothing changes.
The followers continue arguing, each waiting for someone else to surrender first. Eventually, one of them gives an irritated shake of the head and begins working alone.
Another joins, though not where they were told.
A third chooses a different task entirely. More follow in uneven fits, taking whatever work seems most useful to them. No one leads them. No plan is ever spoken aloud. Even so, the disorder gradually settles into something functional.
<<if _state.materialType is "food">>
The food is divided, prepared, and stored before any of it is lost. The work takes longer than it might have under a single guiding hand, but it is finished.
<<else>>
The materials are sorted and the most urgent repairs are completed. The work lacks any common method, but the camp receives what it needed.
<</if>>
By the end, several followers are loudly claiming that their own contribution saved the entire effort.
Perhaps all of them are partly right.
<<else>>
You leave them to settle the matter without you.
The arguments continue.
One follower begins working, then stops when another rearranges what they have done. A second effort ends much the same way. Each failed attempt gives the others fresh reason to insist that their own method should have been followed from the beginning.
No one yields. No one takes command.
<<if _state and _state.materialType is "food">>
The sun climbs higher while the baskets remain where they were dropped. By the time hunger finally overcomes pride, some of the meat has turned and much of the gathered food can no longer be saved.
<<else>>
The piles remain scattered as the day passes. Materials disappear into unrelated tasks, exposed cord and hides are damaged, and the repairs that started the dispute remain unfinished.
<</if>>
They were free to arrange the work however they wished.
And it seems they were equally free to leave it undone.
<</if>>
<<if _state and _state.materialChange < 0>><div class="result-list"><div class="result-line bad"><span class="label">Loss</span><span class="value"><<print Math.abs(_state.materialChange)>> <<if _state.materialType is "food">>Food<<else>>Resources<</if>></span></div></div><</if>>
</div>''
<div class="hub-buttons"><<button "Let them clean up their own mess.">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_many_hands_no_master") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _state = setup.traditionEvents.ensureManyHandsNoMasterState(_entry)>>
<<if _state and !_state.applied>><<set _state.option = "charisma">><<set _state = setup.traditionEvents.applyManyHandsNoMasterOutcome(_entry, "charisma")>><</if>>
<</silently>>
''<div class="hub-textbox">
<<if _state>><div class="result-list result-list-check">
<div class="result-line <<if _state.success>>good<<else>>bad<</if>>"><span class="label">Charisma check</span><span class="value"><<if _state.success>>SUCCESS<<else>>FAIL<</if>></span></div>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _state.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _state.total>> / <<print _state.dc>></span></div></div><</if>>
<<if _state and _state.success>>
You step among them without naming a leader or singling out anyone who must obey.
Instead, your attention passes from one follower to another. A glance toward the abandoned work. A small gesture toward an empty pair of hands. A word here, a word there. Not commands, exactly. Suggestions. Gentle nudges that make each person feel as though the conclusion was their own.
One person moves.
Then another.
The hesitation breaks quickly after that. Followers choose their own tasks, trading places whenever one proves better suited to the work. What began as a neglected obligation becomes a shared effort, carried forward without threats, ranks, or commands.
<<if _state.materialType is "food">>
The meat is cut and hung before the heat can ruin it. Roots and berries are sorted, damaged pieces discarded, and the remaining food packed away with unusual care. By the time the work ends, your people have preserved more than anyone expected.
<<else>>
The scattered materials are sorted and put to use. Repairs thought to require an entire day are finished before long, and the tribe recovers several useful pieces that would otherwise have been forgotten beneath the piles.
<</if>>
No one was ordered to contribute.
For today, they did not need to be.
<<else>>
You step among them without naming a leader or giving anyone the right to command the rest.
Your efforts draw a few followers toward the abandoned work. One lifts a basket. Another begins sorting through the nearest pile. For a moment, it seems that the rest might follow.
They do not.
The momentum you begin to build fizzles out before it has room to breathe.
Those who started soon notice how many others remain idle. Their willingness curdles into irritation. One abandons the task after deciding they have already done more than their share. Another follows. The few scattered efforts that remain only interfere with one another.
<<if _state and _state.materialType is "food">>
By the time anyone returns to the work, some of the food has spoiled beneath the heat. Meat is thrown away, crushed roots are found beneath overturned baskets, and much of what could have been preserved is lost.
<<else>>
By the time anyone returns to the work, useful materials have been damaged, misplaced, or taken for private tasks. The original repairs remain unfinished, and replacing what was wasted will require more than the tribe began with.
<</if>>
It seems your camp’s loose command structure has its costs.
<</if>>
<<if _state and _state.materialChange > 0>><div class="result-list"><div class="result-line good"><span class="label">Gain</span><span class="value"><<print _state.materialChange>> <<if _state.materialType is "food">>Food<<else>>Resources<</if>></span></div></div><<elseif _state and _state.materialChange < 0>><div class="result-list"><div class="result-line bad"><span class="label">Loss</span><span class="value"><<print Math.abs(_state.materialChange)>> <<if _state.materialType is "food">>Food<<else>>Resources<</if>></span></div></div><</if>>
</div>''
<div class="hub-buttons"><<button "Let the camp sort out the rest.">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_many_hands_no_master") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _state = setup.traditionEvents.ensureManyHandsNoMasterState(_entry)>>
<<if _state and !_state.applied>><<set _state.option = "order">><<set _state = setup.traditionEvents.applyManyHandsNoMasterOutcome(_entry, "order")>><</if>>
<</silently>>
''<div class="hub-textbox">
<<if _state>><div class="result-list result-list-check">
<div class="result-line <<if _state.success>>good<<else>>bad<</if>>"><span class="label">Leadership check</span><span class="value"><<if _state.success>>SUCCESS<<else>>FAIL<</if>></span></div>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _state.roll>></span></div>
<div class="result-line"><span class="label">Leadership + d20 vs DC</span><span class="value"><<print _state.total>> / <<print _state.dc>></span></div></div><</if>>
You choose one follower from among the crowd.
Your gaze fixes upon them, then moves deliberately across the neglected work and the people surrounding it. The meaning is unmistakable. For this task, their decisions will carry your authority.
The reaction is immediate.
<<if _state and _state.levelId is "loose_ways">>
Several followers exchange displeased looks. A few mutter beneath their breath, but most wait to see whether the newly appointed leader can make anything of the role forced upon them.
<<else>>
Resentment passes openly through the gathering. Questions come quickly. Why should this person decide? Why should the others obey? What makes their judgement worth more than anyone else’s?
<</if>>
The follower you selected looks toward you once more before turning to face the others.
<<if _state and _state.success>>
They do not hesitate.
Tasks are divided with quick gestures. Those who object are given the hardest work or placed beside followers unwilling to indulge them. Every new argument is cut short before it can spread.
Your authority hangs behind each instruction, silent but impossible to mistake.
<<if _state.materialType is "food">>
The food is prepared and stored before any of it spoils. Nothing more is gained, but nothing is allowed to go to waste.
<<else>>
The materials are sorted, the necessary repairs completed, and the remaining supplies returned to their proper places. Nothing more is gained, but the work is finally done.
<</if>>
The chosen follower steps away once the task is complete. The authority you gave them was temporary.
The memory of obeying it may last longer.
<<else>>
The follower you chose attempts to divide the work.
The others answer every instruction with another question. Some ignore them outright. Others deliberately choose different tasks, forcing the appointed leader to abandon one argument only to confront another.
Your authority is understood.
It simply is not enough to make them accept the person through whom you have chosen to exercise it.
<<if _state and _state.materialType is "food">>
The dispute consumes what little time remained. Food is left exposed, baskets are overturned during the arguing, and part of what the tribe gathered must be discarded.
<<else>>
The dispute leaves the materials in worse condition than before. Useful pieces are misplaced or damaged, while the repairs that began the argument remain unfinished.
<</if>>
Eventually, the follower you selected gives up. The others drift away soon afterward, each satisfied that no one among them proved capable of becoming their master.
The work remains undone.
Your attempt to impose order does not.
<</if>>
<<if _state and _state.materialChange < 0>><div class="result-list"><div class="result-line bad"><span class="label">Loss</span><span class="value"><<print Math.abs(_state.materialChange)>> <<if _state.materialType is "food">>Food<<else>>Resources<</if>></span></div></div><</if>>
</div>''
<div class="hub-buttons"><<button "Let the order stand.">><<endMajorEvent>><</button>></div><<silently>>
<<run setup.mishanContact.restoreKael()>>
<</silently>>
''<div class="hub-textbox">
Several weeks have passed since Kael and the other hunters left.
Long enough for their absence to become part of the camp's routine. Aedan has stopped asking when his father will return, at least where anyone can hear him, while every hunting party that comes back through the trees draws a few expectant glances before people return to their work.
Then, one day, the waiting ends.
You notice the commotion near the edge of camp first. Kael emerges from the trees alongside the men who left with him, all of them dirty from travel and visibly worn down by the journey, but otherwise unharmed.
He spots you among the gathering tribespeople and makes his way over.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“The scouting mission was a success.”</span>
</div>
There is little satisfaction in the words. If anything, the journey appears to have left him more concerned than when he departed.
You ask what he found.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“More than I expected. Or...”</span>
</div>
Kael hesitates.
It is rare enough that you simply wait.
He glances toward the men who accompanied him before continuing.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Calling it a camp would be wrong. They have buildings there that look as though they have stood for years. Fields beyond them. And defenses around parts of the settlement unlike anything I've seen before.”</span>
</div>
His brow tightens slightly as he searches for the right comparison.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Not barricades like ours. Raised earth, timber... walls high enough that a man couldn't simply climb or vault over them.”</span>
</div>
He pauses.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“And there are a lot of people, $user. We kept our distance, so I couldn't give you a number I would trust, but... more than I've ever seen gathered in one place.”</span>
</div>
You say nothing, leaving him to finish the report in his own time.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Their hunters range through the country around the lake. Their warriors do the same. Most of the groups we saw knew the land well and stayed close to it, but others came back from much farther out.”</span>
</div>
He folds his arms.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Those ones usually weren't empty-handed. Food. Worked goods. Materials. More than a hunting party would have reason to carry home.”</span>
</div>
Whether they gathered it themselves, took it, or received it from someone else, Kael cannot say. The pattern itself is enough to concern him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“The displaced hunters were right. These people don't behave as though they share this land with anyone.”</span>
</div>
You ask whether anyone saw him.
For the first time since beginning the report, Kael takes noticeably longer to answer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“I don't think anyone got a good look at us.”</span>
</div>
He considers that for another moment.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“But I wouldn't wager much on them having seen nothing. Whether they know who we are...”</span>
</div>
His eyes drift briefly across the camp.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Probably not. I wouldn't take much comfort from that.”</span>
</div>
Kael looks back to you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“We've been making ourselves known in this region, $user. Some of it good. Some of it bad. Other tribes know us now, and people talk.”</span>
</div>
There is no accusation in the observation. He states it as he would the weather or the tracks of an animal he expects to cross again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Sooner or later, word of us will reach them. We should decide what we intend to do before that happens.”</span>
</div>
A brief silence follows.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“We could start setting aside tribute. I don't like the thought of it, but if the displaced hunters were telling the truth about how these people deal with their neighbors, it may buy us time.”</span>
</div>
His expression makes his opinion of the suggestion plain enough, but he does not dismiss it merely because he dislikes it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Or we could—”</span>
</div>
A shout from the far side of camp cuts him off.
Several heads turn at once.
One of the men keeping watch at the perimeter is already running toward you, calling out before he reaches the gathering.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">“Chieftain! People coming from the east!”</span>
</div>
Kael turns immediately.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“How many?”</span>
</div>
The lookout slows as he reaches you, breath coming hard from the run.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">“Thirty. Maybe forty. All armed.”</span>
</div>
The effect on the camp is immediate.
Men abandon whatever they were doing and reach for spears. Those nearest the outer shelters call others back toward the center, while parents pull children away from the edge of camp. Thirty or forty warriors would be enough to threaten nearly everyone here if they came looking for blood.
The lookout notices the reaction and quickly adds:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">“They're not attacking. At least, I don't think they are.”</span>
</div>
He glances back in the direction he came from.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">“They're walking. Slowly. Staying together.”</span>
</div>
Kael's attention remains fixed on the eastern edge of camp.
Only a few moments ago, he had been discussing what you should do when the people by the lake finally learned you were here.
Whether these strangers are those same people remains to be seen.
But the rest of the conversation will have to wait.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go meet them</span>">>
<<goto "Event_Major_MishanContact_Arrival">>
<</button>>
</div>''<div class="hub-textbox">
By the time you reach the eastern edge of camp, most of your hunters have already gathered there. Nobody has formed a proper battle line yet, but spears are in hand and the people behind them have begun moving children and supplies farther from the perimeter. Kael falls in beside you without needing to be asked.
The strangers are easy to see now.
There are perhaps thirty-five of them, all armed. That alone would be enough to make them dangerous, but what catches your attention more is the way they carry themselves.
Your own hunters are dressed and equipped according to whatever each man owns, has made, or has taken over the years. The approaching warriors are different. Their weapons vary, but much of what they carry seems made to the same patterns. Spears of similar length. Shields worked in much the same fashion. Repeated markings appear across clothing, painted skin, and equipment. Even the way they keep their distance from one another feels practiced.
They do not look like men gathered together for a raid that morning. They look like men accustomed to moving as one group.
Kael watches them in silence.
None of the strangers raise a weapon. When they come close enough that a charge would carry them into the camp quickly, the group stops almost as one. A few men spread slightly to either side, but there is no rush forward and no attempt to surround you.
Then one man continues walking.
You recognize immediately why the others let him.
He is young, though there is something about the easy confidence in his expression that makes the word feel inadequate. He is tall and broad through the shoulders, carrying his size without any of the stiffness of a man trying to appear imposing. Dark hair has been braided back from his face, while one side is hidden behind a rough mask strapped over an old burn wound.
His clothing is heavier and better worked than most of what you see around your own fires. Fur hangs from his shoulders, while bone, carved ornaments, and trophies crowd his chest and belt. Among them hang several human heads in varying states of decay.
Across his shoulders rests a long spear.
The weapon itself is unusual only in its workmanship. The violet stone at its tip is another matter. Even in daylight, a faint light seems to live somewhere inside it.
The man stops several paces from you and says nothing at first. His gaze moves across the camp instead: the shelters, the drying racks, the fires, the people standing behind you with spears clutched a little too tightly in their hands.
Whatever he expected to find, this apparently was not it.
He says something in a language you have never heard before.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“This is it?”</span>
</div>
One of the hunters near you glances toward Kael in confusion. Kael does not answer. His eyes remain on the stranger.
You do.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">You</span>
<span class="dialogue-line">“It is.”</span>
</div>
The man's gaze returns to you. For the first time since approaching, something in his expression changes. His eyebrows rise slightly, and the lazy inspection of your camp gives way to more focused attention.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You understood me.”</span>
</div>
It is not really a question.
For several moments he simply studies you. Then the smile begins to return.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Interesting.”</span>
</div>
Behind you, Kael shifts his attention briefly toward you. He understood none of the exchange, but he has clearly realized that you did.
The stranger takes another look over you, this time with considerably more care.
<<if $height < 190>>
His eyes travel from your face to your shoulders and back again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“A little smaller than I expected.”</span>
</div>
There is no real mockery in his voice. If anything, he sounds mildly disappointed that one of the stories he heard has failed to match reality.
<<else>>
His eyes travel over your frame before settling back on your face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“At least they got the size right.”</span>
</div>
His smile widens slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Good. A chieftain should look like he can survive being one.”</span>
</div>
<</if>>
He lets the spear slide from his shoulders and plants its butt lightly against the ground. For the first time, you notice just how little the warriors behind him have moved since stopping.
Not one has spoken out of turn. Not one seems particularly concerned by the armed camp facing them.
The stranger gestures loosely toward himself.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Kavnok.”</span>
</div>
Then, with the same casual motion, toward the warriors behind him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Mishan.”</span>
</div>
The name means nothing to most of the people around you. Judging by Kael's expression, it means nothing to him either.
Kavnok's attention settles on you again. He lifts the strange spear and points its glowing tip loosely in your direction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“And I take it you're $user.”</span>
</div>
Kael's expression hardens almost imperceptibly as he exchanges a short glance with you.
Kavnok watches the exchange for a moment before his attention returns to you.
<<if setup.mishanContact.isWildlingPresent()>>
His eyes stray briefly past your shoulder.
<<if $questFlags and $questFlags.q_wildling_second_name_set>>
$wildlingName stands among the people watching the newcomers, her attention fixed more on Kavnok than on the warriors behind him.
<<else>>
The Wildling stands among the people watching the newcomers, her attention fixed more on Kavnok than on the warriors behind him.
<</if>>
Kavnok looks her over for a moment longer than the others.
Whatever she reads in the expression, she apparently dislikes it. A quiet scoff leaves her throat.
She cannot understand his words, but she does not need to.
Kavnok notices. Rather than taking offense, he seems faintly amused before returning his attention to you.
<</if>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I usually don't bother visiting camps like this myself.”</span>
</div>
His gaze drifts once more toward the shelters behind you. The judgment in it is not particularly difficult to read.
Then he looks back at you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“But I've been hearing quite a lot about their chieftain.”</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>What have you heard?</span>">>
<<goto "Event_Major_MishanContact_Rumors">>
<</button>>
</div><<silently>>
<<run setup.mishanContact.startCampaign()>>
<<set _biggerFishExists = !!($quests && $quests.some(function (quest) { return quest && String(quest.id ?? "") === "q_bigger_fish"; }))>>
<<if !_biggerFishExists>>
<<addQuestMarkerless
"q_bigger_fish"
"There’s Always a Bigger Fish"
"Kavnok came to your camp at the head of a few dozen Mishan warriors and made one thing clear: the people near the great lake consider this entire region theirs."
"For now, your tribe is beneath his concern. There is no guarantee it will stay that way."
""
>>
<</if>>
<</silently>>
''<div class="hub-textbox">
Kavnok remains standing for a moment, spear resting comfortably against one shoulder.
The Mishan behind him seem to recognize the change before anyone on your side does. A few begin shifting position, preparing to leave without needing to be told.
Kavnok looks back toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One thing before I go.”</span>
</div>
He gestures loosely with the spear, indicating the camp and the country beyond it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You're wandering through Mishan country.”</span>
</div>
There is nothing ceremonial in the declaration. He speaks as though explaining that the lake contains water.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Camp here. Hunt here. Trade with whoever you like. Fight them, fuck them, pray with them. I don't particularly care.”</span>
</div>
His expression grows a little more serious.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“But if what you do starts costing me men, tribute, or time, then I will.”</span>
</div>
<<if $mishanContact.outcome is "refusal">>
His attention remains on you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“...But I have a feeling you'll make me repeat that in person someday.”</span>
</div>
There is no anger behind the observation.
Kavnok adjusts the spear against his shoulder.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“For the health of your... tribe members, I recommend you fall in line.”</span>
</div>
A trace of his earlier amusement returns.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Personally, though? I'm eager to see what happens if you don't.”</span>
</div>
The warning and the anticipation behind it sit strangely comfortably beside one another.
<<else>>
His attention lingers on you for a moment before he gives a small nod.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You seem sensible enough that I shouldn't need to repeat myself.”</span>
</div>
After everything that came before it, his approval carries its own kind of insult.
<</if>>
Kavnok turns partially toward his warriors.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Besides, I have real problems waiting for me.”</span>
</div>
His eyes travel across your camp one final time before returning to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Until next time, $user.”</span>
</div>
A short pause follows.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“If such a time arrives.”</span>
</div>
With that, whatever remaining interest he had in prolonging the visit disappears.
Two of his warriors step forward to collect the furniture.
<<if $mishanContact.outcome is "refusal" and ($mishanContact.test is "spark" or $mishanContact.test is "sway" or $mishanContact.test is "tribute")>>
One stops beside the chair you destroyed. Its back hangs in broken pieces, several of the carefully fitted joints split beyond any repair that can be managed here.
He looks toward Kavnok.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Take it.”</span>
</div>
The warrior gathers the pieces without another word.
<</if>>
<<if $mishanContact.outcome is "refusal" and $mishanContact.test is "mend_wounds">>
Two warriors move toward Nokai's body and lift him between them.
The Mishan handle the corpse with the same practiced efficiency they have shown throughout the visit. Nobody protests. Nobody asks what will become of him.
<</if>>
<<if $mishanContact.outcome is "compliance" and $mishanContact.test is "mend_wounds">>
Nokai falls back into formation with the others. He still moves carefully, occasionally touching the place where Kavnok's blade entered him as though checking that the wound has not somehow returned.
<</if>>
<<if $mishanContact.outcome is "compliance" and $mishanContact.test is "tribute">>
The last of your tribute is collected alongside everything Kavnok brought with him.
He never looks at it again.
<</if>>
Within moments, the little audience begins disappearing almost as quickly as it appeared. The table is lifted, the remaining chair collected, and the Mishan reform around Kavnok with the same practiced order in which they arrived.
Kavnok settles the spear across his shoulders.
There is no farewell to your tribe.
At a word from him, the Mishan turn east and begin walking. Nobody in your camp tries to stop them.
You watch thirty-odd armed men disappear back through the trees, their formation gradually breaking apart behind trunks and undergrowth until the last of them is lost from sight.
Even then, your people remain quiet.
Only after several moments do spears begin to lower and uncertain conversation spread through the camp. Most understood almost nothing that was said, leaving them to reconstruct the meeting from gestures, expressions, the furniture the Mishan carried in, and whatever happened across that table.
Kael remains beside you, his eyes on the eastern trees for a while longer before he finally looks your way.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“Alright.”</span>
</div>
He glances once more in the direction Kavnok left.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">“What did he actually say?”</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">New quest</span>
<span class="value">There’s Always a Bigger Fish</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Quite a bit...</span>">>
<<run setup.mishanContact.recordResolution()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.mishanContact.prepareRumors()>>
<</silently>>
''<div class="hub-textbox">
Kavnok lets the statement sit for a moment, watching to see what you make of it.
Then he shifts his grip on the spear and continues.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“People come to us from all over this region. Some bring food. Some bring hides, tools, worked stone. Whatever they have that we happen to want.”</span>
</div>
His tone makes the arrangement sound less like trade than routine.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They bring stories too.”</span>
</div>
A faint smile returns to his face.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Most aren't worth listening to. A hunter kills one particularly fat boar, and by the time the tale reaches us there were five of them and each was larger than a man. A chieftain wins one fight and suddenly nobody alive has ever seen him lose.”</span>
</div>
His eyes settle more firmly on you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Lately, though, the same man keeps turning up in them.”</span>
</div>
He means you.
<<if $mishanContact.rumors.length>>
<<if $mishanContact.rumors[0] is "spark">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One man swore he watched you call fire into an empty hand. White flame, apparently. Burst out of nowhere and swallowed half the forest around you.”</span>
</div>
There is enough exaggeration in the last part that even Kavnok seems aware of it.
<<elseif $mishanContact.rumors[0] is "sway">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I heard there's something wrong with your voice. That men listen to you and find themselves agreeing before they've properly thought through whether they should.”</span>
</div>
He looks faintly amused by that one.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The man telling me called it a sickness of the mind.”</span>
</div>
<<elseif $mishanContact.rumors[0] is "ghost_walk">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One story says you walked straight through a stranger's camp as though you'd slept beside their fires for years. Nobody questioned you. Nobody even thought to.”</span>
</div>
His smile widens.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Another man insisted you wore his skin, fooled his woman, and fucked her while she thought you were him.”</span>
</div>
He gives a small shrug.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“That version sounded more entertaining.”</span>
</div>
<<elseif $mishanContact.rumors[0] is "mend_wounds">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say men stop bleeding when you put your hands on them. Wounds close. Flesh pulls itself back together. One man claimed you dragged his brother halfway back from death.”</span>
</div>
<<elseif $mishanContact.rumors[0] is "lingering_echoes">>
His expression becomes a little more curious.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One woman was convinced you could speak with the dead.”</span>
</div>
He gives a quiet laugh.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“She seemed very certain about that one.”</span>
</div>
<<elseif $mishanContact.rumors[0] is "foresight">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Someone else claimed you know things before they happen. That traps fail because you've already seen them, and danger finds you moving before anyone else even knows it's there.”</span>
</div>
<</if>>
<<if $mishanContact.rumors.length > 1>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Then someone else tells me...”</span>
</div>
<<if $mishanContact.rumors[1] is "spark">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One man swore he watched you call fire into an empty hand. White flame, apparently. Burst out of nowhere and swallowed half the forest around you.”</span>
</div>
There is enough exaggeration in the last part that even Kavnok seems aware of it.
<<elseif $mishanContact.rumors[1] is "sway">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I heard there's something wrong with your voice. That men listen to you and find themselves agreeing before they've properly thought through whether they should.”</span>
</div>
He looks faintly amused by that one.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The man telling me called it a sickness of the mind.”</span>
</div>
<<elseif $mishanContact.rumors[1] is "ghost_walk">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One story says you walked straight through a stranger's camp as though you'd slept beside their fires for years. Nobody questioned you. Nobody even thought to.”</span>
</div>
His smile widens.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Another man insisted you wore his skin, fooled his woman, and fucked her while she thought you were him.”</span>
</div>
He gives a small shrug.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“That version sounded more entertaining.”</span>
</div>
<<elseif $mishanContact.rumors[1] is "mend_wounds">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say men stop bleeding when you put your hands on them. Wounds close. Flesh pulls itself back together. One man claimed you dragged his brother halfway back from death.”</span>
</div>
<<elseif $mishanContact.rumors[1] is "lingering_echoes">>
His expression becomes a little more curious.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“One woman was convinced you could speak with the dead.”</span>
</div>
He gives a quiet laugh.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“She seemed very certain about that one.”</span>
</div>
<<elseif $mishanContact.rumors[1] is "foresight">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Someone else claimed you know things before they happen. That traps fail because you've already seen them, and danger finds you moving before anyone else even knows it's there.”</span>
</div>
<</if>>
<</if>>
<<else>>
Kavnok gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The details change depending on who tells it. Half of them can't even agree on what you've supposedly done.”</span>
</div>
His eyes remain on you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They do seem to agree there's something unusual about you.”</span>
</div>
<</if>>
Kavnok studies you for another moment, as though comparing the man in front of him with all the different versions that have reached him.
Then his expression shifts slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“And it isn't only the stranger stories.”</span>
</div>
<<if $mishanContact.highestStat is "strength">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say you're strong. Not simply stronger than the men around you. I've heard stories of warriors looking like children once you put your hands on them.”</span>
</div>
His eyes move over your frame again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“That one, at least, isn't difficult to believe.”</span>
</div>
<<elseif $mishanContact.highestStat is "endurance">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say you're remarkably difficult to kill. Men have watched you take wounds that should have left someone else dead in the dirt, only to see you stand up again.”</span>
</div>
His gaze lingers on you for a moment longer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Useful quality.”</span>
</div>
<<elseif $mishanContact.highestStat is "wisdom">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say you're difficult to fool. Traps get laid, lies get told, and somehow you have an irritating habit of seeing through them.”</span>
</div>
He smiles.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Some of them think you can read minds. Perhaps they're right. Though reading a fool's mind rarely requires magic, wouldn't you agree?”</span>
</div>
<<elseif $mishanContact.highestStat is "leadership">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say your people listen when you give an order, and more importantly, that they usually manage to carry it out. Even frightened. Even when they'd rather do something else.”</span>
</div>
He glances toward the armed hunters gathered behind you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Rare among wandering tribes. I'll admit, that one impressed me.”</span>
</div>
<<elseif $mishanContact.highestStat is "charisma">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Some call you snake-tongued. Others swear honey must seep from your mouth whenever you speak.”</span>
</div>
His smile grows slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Then again, those two usually come together.”</span>
</div>
<<elseif $mishanContact.highestStat is "stewardship">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say you're good at making something from nothing. Food stretches farther. Work gets done. Somehow there is always another pair of hands where you need them.”</span>
</div>
He looks around your camp again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Some of my overseers could learn a thing or two from you. Though they usually learn quickly enough after a little punishment.”</span>
</div>
<</if>>
For the first time, his gaze leaves you for more than a passing glance.
It settles on the spear in his hand.
The violet stone at its tip continues to glow faintly in the daylight. Kavnok turns the shaft between his fingers, watching the light shift across its surface before looking back at you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Normally, I'd call most of it nonsense.”</span>
</div>
His thumb runs slowly along the wood beneath the strange spearhead.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“But I've learned that lesser men call a great many things impossible simply because they've never seen them.”</span>
</div>
He offers nothing further about the weapon.
Instead, his attention returns wholly to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“So I became curious.”</span>
</div>
He glances around the camp once more.
The shelters. The fires. Your armed hunters.
Whatever curiosity brought him here plainly did not extend to them.
Then his eyes return to yours.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I wanted to see what sort of man had so many people telling stories about him.”</span>
</div>
His smile widens a little.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“With all that talk, I assumed he'd be quite the character.”</span>
</div>
A short silence passes as he continues looking you over.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Now that I'm here, I suppose we can find out how much of it is true.”</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let him continue</span>">>
<<goto "Event_Major_MishanContact_Test">>
<</button>>
</div><<silently>>
<<run setup.mishanContact.selectTest()>>
<</silently>>
''<div class="hub-textbox">
For a few moments, nobody moves.
Kavnok continues to watch you, his earlier smile lingering as the violet light at the end of his spear catches against his face.
Around him, thirty-odd Mishan warriors wait in silence.
Your own people do the same.
The space between both groups seems to narrow despite nobody taking a step.
Then Kavnok relaxes.
He gives a single, cheerful clap of his hands.
Several of your hunters tense.
Two Mishan warriors turn and disappear briefly through the ranks. A moment later, they return carrying furniture.
For several seconds, you are not entirely sure what to make of the sight.
One carries a small wooden table while the other has a chair tucked beneath each arm. None of it is lavish. There is no precious stone or unusual material, nothing that would make the pieces remarkable simply for what they are made from.
The workmanship is another matter.
The table stands on fitted legs rather than poles lashed together with hide. Its surface has been cut and worked until it lies almost flat beneath the hand. The chairs are simple, but their seats and backs join cleanly, shaped by someone with more time and skill than most people in your camp could afford to spend making somewhere to sit.
Kavnok watches as the men begin lowering them into place.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Careful.”</span>
</div>
One of them immediately slows.
Kavnok's smile remains perfectly pleasant.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You don't want to end up like Mikan, do you?”</span>
</div>
The warrior's grip tightens around the table.
Kavnok glances toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Sometimes they get careless. Lazy.”</span>
</div>
He gives a small, almost regretful shake of his head.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I hate having to correct them, but it's the only thing that seems to work with some of these men. Lazy by nature, I tell you.”</span>
</div>
He explains it with the weary patience of someone complaining about an unavoidable chore.
Judging by how carefully the furniture touches the ground, none of his warriors seem convinced that he hates it very much.
Kavnok lowers himself into one of the chairs and rests his spear against the table beside him as though he has arrived for an ordinary conversation.
He gestures toward the empty chair opposite.
An invitation.
Or perhaps an expectation.
You take your place across from him.
The warriors return to formation.
It occurs to you that Kavnok had several men carry two chairs and a table all the way from the settlement Kael spent weeks travelling to and from, apparently because he decided there was a chance he might want to sit down when he reached you.
He seems entirely unaware that there is anything strange about this.
Kavnok settles one arm against the armsrest.
<<cgimg "images/events/mishan_meet/kavnok.png" alt="Amogus">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Much better.”</span>
</div>
For a little while, he says nothing else. His fingers drum idly against the wood as he studies you.
Then something seems to occur to him.
<<if $mishanContact.test is "spark">>
Kavnok's gaze drops toward your hands.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Let's start with the fire.”</span>
</div>
He leans back slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“White flame from an empty hand. That was one of the more popular stories.”</span>
</div>
His eyes return to yours.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Go on, then.”</span>
</div>
He motions toward you with one hand, almost like someone encouraging a performer to begin.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Show me.”</span>
</div>
There is no reverence in the request, nor any obvious apprehension.
He has travelled this far because people told him you could do something impossible. Now that you are sitting in front of him, he apparently sees no reason you should not simply demonstrate it when asked.
<<elseif $mishanContact.test is "sway">>
Kavnok considers you for another moment before his smile returns.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The voice interests me.”</span>
</div>
His fingers stop against the tabletop.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The way they tell it, men hear you speak and suddenly whatever you want starts sounding like their own idea.”</span>
</div>
A quiet laugh escapes him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Useful, if true.”</span>
</div>
Rather than indicate one of his warriors, Kavnok taps two fingers against his own chest.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Use it on me.”</span>
</div>
There is an almost reckless curiosity in the invitation. He seems less concerned by what you might make him do than interested in discovering whether you truly can.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Nothing too embarrassing.”</span>
</div>
His smile widens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Unless you think you can manage it.”</span>
</div>
<<elseif $mishanContact.test is "mend_wounds">>
Kavnok's attention shifts toward the warriors behind him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The healing.”</span>
</div>
He says it almost absently.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“That one should be easy enough to test.”</span>
</div>
He turns his head.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Nokai. Come here.”</span>
</div>
One of the warriors steps forward.
He approaches without hesitation and stops beside Kavnok's chair.
Kavnok draws a short blade.
There is no warning.
He drives it deep into the man's side.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Mishan Warrior</span>
<span class="dialogue-line">“AAH—ghk!”</span>
</div>
The warrior folds around the blade before Kavnok pulls it free.
Several of your people jerk forward.
The Mishan line barely moves.
The wounded man staggers, one hand pressing desperately against his side as blood spills between his fingers. Kavnok calmly wipes the blade against the man's clothing before putting it away.
The wound is deep. Not immediately fatal, perhaps, but the amount of blood already soaking through his hand makes the likely outcome clear enough if nothing is done.
Kavnok points toward him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“There.”</span>
</div>
The man sinks to one knee.
Kavnok looks back at you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“They say you can fix that.”</span>
</div>
The bleeding warrior seems to have become little more than a convenient way of answering a question.
Kavnok gestures toward him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Show me.”</span>
</div>
<<else>>
Kavnok's fingers stop against the tabletop.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Well.”</span>
</div>
He looks around your camp once more.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Perhaps the stories will have to wait.”</span>
</div>
His gaze passes over the shelters, the stores, and the people gathered behind you. After a moment, another thought seems to occur to him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Everyone around here brings something when they come before the Mishan.”</span>
</div>
He says it with the casual certainty of someone explaining a custom too obvious to require justification.
His eyes move toward your stores, then back to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Do you understand what I'm implying, or do I need to spell it out for you?”</span>
</div>
Then he leans back in his chair and waits.
<</if>>
</div>''
<<if $mishanContact.test is "spark">>
<div class="hub-buttons">
<<button "<span class='choice-text'>Show him</span><span class='choice-note'>[Spark — 20 Belief]</span>">>
<<if setup.mishanContact.commit("compliance")>><<goto "Event_Major_MishanContact_TestResolve">><</if>>
<</button>>
<<button "<span class='choice-text'>Refuse</span>">>
<<run setup.mishanContact.commit("refusal")>><<goto "Event_Major_MishanContact_TestResolve">>
<</button>>
</div>
<<elseif $mishanContact.test is "sway">>
<div class="hub-buttons">
<<button "<span class='choice-text'>Try to influence him</span><span class='choice-note'>[Sway — 20 Belief]</span>">>
<<if setup.mishanContact.commit("compliance")>><<goto "Event_Major_MishanContact_TestResolve">><</if>>
<</button>>
<<button "<span class='choice-text'>Refuse</span>">>
<<run setup.mishanContact.commit("refusal")>><<goto "Event_Major_MishanContact_TestResolve">>
<</button>>
</div>
<<elseif $mishanContact.test is "mend_wounds">>
<div class="hub-buttons">
<<button "<span class='choice-text'>Heal the warrior</span><span class='choice-note'>[Mend Wounds — 20 Belief]</span>">>
<<if setup.mishanContact.commit("compliance")>><<goto "Event_Major_MishanContact_TestResolve">><</if>>
<</button>>
<<button "<span class='choice-text'>Refuse</span>">>
<<run setup.mishanContact.commit("refusal")>><<goto "Event_Major_MishanContact_TestResolve">>
<</button>>
</div>
<<else>>
<div class="hub-buttons">
<<set _tributePreview = setup.mishanContact.getTributePreview()>>
<<button "<span class='choice-text'>Give him the tribute</span><span class='choice-note'>[<<print _tributePreview.food>> Food, <<print _tributePreview.resources>> Resources, <<print _tributePreview.goods>> Goods]</span>">>
<<if setup.mishanContact.commit("compliance")>><<goto "Event_Major_MishanContact_TestResolve">><</if>>
<</button>>
<<button "<span class='choice-text'>Refuse</span>">>
<<run setup.mishanContact.commit("refusal")>><<goto "Event_Major_MishanContact_TestResolve">>
<</button>>
</div>
<</if>>''<div class="hub-textbox">
<<if $mishanContact.outcome is "compliance">>
Kavnok waits.
There is no impatience in him. He sits comfortably behind the table, apparently certain that whatever answer you give will arrive when he expects it to.
After a moment, you give it.
<<if $mishanContact.test is "spark">>
You hold out one hand, and Kavnok's attention immediately settles on it.
For an instant, your palm is empty.
Then white fire blooms across it.
Several of the Mishan warriors shift despite themselves. A low murmur passes through the people behind you as the unnatural flame throws its light across the table.
Kavnok does not recoil. The casual amusement that has accompanied most of the meeting disappears as he leans forward, studying the flame with sudden concentration.
It gives off no smoke, yet the heat is real. Its pale light plays across his features and catches in the violet stone of the spear resting beside him.
His attention passes between the two.
Slowly, Kavnok extends one hand toward the flame. He stops before touching it, holding his palm near enough to feel its warmth while his eyes search your empty hand for some explanation that is not there.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“So that one was true.”</span>
</div>
There is no mockery in his voice now.
He looks closer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“No ember. No tinder. Nothing hidden in your hand.”</span>
</div>
His gaze lingers briefly on his own spear before returning to the flame, though whatever comparison occurs to him remains unspoken.
Eventually, you close your hand and extinguish it.
Kavnok sits back. Genuine interest remains in his expression, but the intensity with which he studied the fire fades once his attention returns to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“And all I had to do was ask. What an obedient 'chieftain' you are, hm?”</span>
</div>
The fire interested him.
You, apparently, less so.
Whatever question he had about the truth of the stories has been answered, but your willingness to perform for him seems to have answered another one as well.
<<elseif $mishanContact.test is "sway">>
You accept.
That appears to please Kavnok immediately. He leans forward slightly, both hands resting loosely against the table as he waits to discover what the stories failed to explain.
You fix your attention on him and tell him to drop the spear.
The words themselves are ordinary.
What follows them is not.
Kavnok continues watching you for another moment before his fingers begin to loosen around the shaft.
The spear slips.
His eyes drop toward his own hand.
Surprise passes cleanly across his face as his grip opens further and the weapon begins to tilt toward the ground.
Then his jaw snaps shut.
Hard.
His body stiffens, and when his mouth opens again, blood is already gathering along his lower lip.
The spear stops falling.
His fingers tighten around it.
For several breaths Kavnok remains motionless, looking first at his hand and then at you. When he finally grins, there is blood across his teeth.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Pleasant, I'll admit.”</span>
</div>
He touches his tongue cautiously against one tooth and winces at whatever damage he has done.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Still... I hate it.”</span>
</div>
The pain seems to have done what he intended. Once he recognized that something foreign was shaping his thoughts, the sudden shock gave him something immediate and entirely his own to focus upon.
Kavnok turns the spear slowly in his hand.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I knew I didn't want to drop it. I could feel that.”</span>
</div>
He seems almost delighted by the contradiction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“And for a moment, it didn't matter.”</span>
</div>
He wipes the blood from his mouth with the back of his hand.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Useful. Very useful.”</span>
</div>
His eyes settle on you again.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Especially in the hands of someone so obedient.”</span>
</div>
The fascination with what just happened remains obvious, but whatever interest it created in the power does not appear to have carried over to the man who used it at his request.
<<elseif $mishanContact.test is "mend_wounds">>
You rise and move toward Nokai.
The wounded warrior is barely managing to remain upright. Blood covers his hand and runs freely down his side, pooling beneath one knee as his breathing grows progressively weaker.
Kavnok watches closely as you place your hands over the injury.
Nokai jerks at the contact.
The bleeding slows.
His expression changes as the torn flesh begins drawing together beneath your hands. What had been an open wound gradually closes until the blood coating his side is no longer being replaced by more.
The Mishan warriors behind Kavnok grow noticeably less composed. One mutters something under his breath, while another leans forward before apparently remembering himself.
Kavnok hears them.
He never looks away.
Nokai's breathing steadies, and by the time you remove your hands, the wound that should have killed him has become damaged but living flesh.
The warrior stares down at his side before touching it cautiously.
Kavnok rises and walks around the table.
Several of your hunters tense at the movement, but he merely stops in front of Nokai and places a hand against the newly repaired wound.
Nokai flinches.
Kavnok presses harder, probing the flesh with his fingers as though inspecting the work of a craftsman.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Stand.”</span>
</div>
Nokai obeys.
He rises unsteadily at first, bracing for pain that never seems to arrive with the severity he expected. After several breaths, even his own surprise becomes difficult to hide.
Kavnok gives him a light shove toward the Mishan line.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Go.”</span>
</div>
Nokai returns to the others.
Only then does Kavnok turn back to you, unmistakable curiosity showing in his eyes.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“What a fun little trick you have there.”</span>
</div>
He looks toward Nokai once more, seemingly pleased by the simple fact that a man he had just mortally wounded can now walk away under his own power.
<<if setup.mishanContact.isWildlingPresent()>>
The Wildling has spent most of the demonstration watching Kavnok rather than Nokai's repaired side.
Once the wounded warrior is safely back among his people, she spits onto the ground.
Kavnok catches the gesture from the corner of his eye but does little more than glance toward her before returning his attention to you.
<</if>>
After another moment, some of his enthusiasm fades.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Though using something like that so readily does take some of the novelty out of it.”</span>
</div>
His gaze passes from you to Nokai.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Oh well.”</span>
</div>
<<else>>
You give the order.
Kael hears it and immediately begins passing instructions to the right people. His expression tightens once he understands what you intend, but he does not question you in front of the Mishan. Whatever his opinion, he trusts your judgment enough to carry it out.
Before long, a modest collection of food, materials, and worked goods is brought forward and placed beside the table.
It is not enough to meaningfully enrich a settlement on the scale Kael described.
Kavnok looks at it with obvious boredom.
Then he lifts one foot and kicks over the nearest basket.
Food and goods spill across the ground.
Without looking away from you, he addresses one of his warriors.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Pick it up.”</span>
</div>
The man steps forward immediately and begins gathering what Kavnok just scattered.
Kavnok pays him no attention.
He has been watching you the entire time.
Only after the warrior has begun collecting the tribute does he nod.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Good.”</span>
</div>
There is approval in the word, but little of the curiosity that colored his earlier conversation.
He settles back into his chair.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You understood after all.”</span>
</div>
The supplies themselves barely seem to register with him. Whether the Mishan leave with a little more food or a few additional goods was plainly never the important part.
His men begin gathering the rest.
Kavnok's interest in you has not disappeared entirely, but much of its earlier intensity has.
<</if>>
For a while, Kavnok says nothing.
He studies you across the table, though whatever he saw during the test seems to have left him more settled than before. Even where the stories proved true, the man behind them apparently fits more comfortably into his understanding of the world now.
His fingers resume their idle rhythm against the wood.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Hm. I expected more trouble from you.”</span>
</div>
There is no obvious insult in his tone, though neither does he sound particularly disappointed to have avoided it.
His attention drifts toward the people gathered behind you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Perhaps that's why you've managed to keep them alive.”</span>
</div>
Amusement creeps back into his voice.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Plenty of men mistake bravado for actual strength. Bravado is a luxury best left to men strong enough to survive it.”</span>
</div>
He taps his own chest with two fingers.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Men like me.”</span>
</div>
Kavnok takes hold of his spear and rises, relaxed enough now that much of the tension surrounding the meeting goes with the movement.
<<if $mishanContact.test is "tribute">>
His attention passes briefly toward the supplies his men are preparing to carry away.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Perhaps those stories of yours will prove interesting another time.”</span>
</div>
<<else>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You have some interesting tricks, $user.”</span>
</div>
<</if>>
He settles the spear comfortably against his shoulder.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Either way, I think I understand you well enough for now.”</span>
</div>
There is something faintly unpleasant about how reassuring he appears to find that conclusion.
He turns toward his warriors.
Whatever audience he intended to hold here is over.
<<else>>
For several moments, Kavnok simply waits.
He made his request with the easy confidence of someone accustomed to seeing such things obeyed without question. Behind him, the Mishan remain motionless, while Kael and the others watch an exchange they can only partly understand, tense and waiting to see where it leads.
Eventually, you rise from the chair.
Kavnok's eyes follow you upward.
<<if $mishanContact.test is "spark" or $mishanContact.test is "sway">>
You tell him that if he wants a demonstration, you can give him one.
If you use it on him, though, he may not survive the experience.
For the first time since sitting down, the idle movement of Kavnok's fingers against the table stops.
You reach behind yourself and take hold of the chair.
The wood is considerably better worked than anything your tribe would normally waste time shaping into furniture. Smooth joins, carefully fitted pieces, a solid frame meant to endure years of use.
Your fingers close around the backrest.
The wood creaks beneath your grip before giving way.
One fitted support splits, then another. You wrench the back apart in your hand and let the broken section fall beside your feet before dropping what remains of the chair after it.
Whatever power Kavnok came expecting to see remains yours to show when and where you choose.
Not because he told you to.
<<elseif $mishanContact.test is "mend_wounds">>
Nokai is still kneeling beside the table.
Blood has spread across his side and down one leg, his breathing growing shallower while one hand remains pressed uselessly against the wound Kavnok gave him.
You could stop it.
Without your intervention, he is going to die. Healing him would be simple enough, but it would also mean doing exactly what Kavnok ordered you to do.
You rise and tell Kavnok that he wanted proof you have the power to decide whether a dying man lives.
Then he already has it.
Nokai sways.
You step toward him.
For an instant, relief crosses the wounded man's face.
Then you plant a foot against him and force him onto his back.
Confusion replaces the relief.
Your heel comes down hard.
There is a brief, sickening impact, and Nokai goes still.
His suffering ends quickly.
It is more mercy than Kavnok offered him, though the reason the mercy took this form has as much to do with your refusal to obey as it does with sparing Nokai a slower death.
You turn back toward Kavnok.
The demonstration he requested will not be happening.
<<if setup.mishanContact.isWildlingPresent()>>
Behind you, the Wildling makes a low sound in her throat.
Her eyes pass over Nokai's body before settling on Kavnok.
Then she points toward him and makes a short, unmistakable gesture across her throat.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Wildling</span>
<span class="dialogue-line">“You next, soft man.”</span>
</div>
Kavnok cannot understand the words, but the gesture requires little translation.
His eyes flick toward her.
For a moment, something flashes behind his eyes.
<</if>>
<<else>>
You rise from the chair.
Kavnok watches without making any move to follow.
You make it clear that you understood his implication perfectly.
Rather than call for food, goods, or anything else from your stores, you reach behind yourself and take hold of the chair.
Your fingers tighten around the wooden back.
The frame groans before splitting apart in your grip.
One fitted support snaps, followed by another as you tear the backrest loose and let the ruined chair collapse beside the table.
He wanted to know whether you understood what was expected of you.
Now he has his answer.
<</if>>
A murmur runs through your side of the gathering.
The Mishan remain quieter, but not completely still. A few men shift their footing, and several hands tighten around weapons.
<<if $mishanContact.test is "mend_wounds">>
Some glance toward Nokai's body.
None step forward.
<</if>>
Kael moves slightly nearer to you.
He may not have understood the words exchanged between you and Kavnok, but he does not need them to recognize that whatever was just asked of you has been rejected.
Kavnok has not moved.
He remains seated, watching you.
The smile has disappeared.
For several long moments, nothing in his expression gives away what he intends to do next.
Then his hand closes around the spear.
He lifts it from where it rests beside the table.
A few of your hunters immediately bring their own weapons higher.
Kavnok lowers the butt of the spear toward the earth.
It touches the ground with little more than a tap.
The earth answers as though struck by something far greater.
A violent jolt runs beneath your feet. The table bucks between you, dust jumps from the ground, and people on both sides stumble or widen their stance to keep their balance.
The tremor is over almost as soon as it begins.
The violet stone at the spear's tip burns a little brighter.
Kavnok remains seated through all of it, one hand resting loosely around the shaft.
His eyes never leave you.
Silence returns.
Then the corner of his mouth rises.
Whatever threat seemed to hang over the clearing drains out of his expression.
Kavnok laughs.
Not loudly, nor for particularly long, but there is unmistakable satisfaction in it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Good.”</span>
</div>
He leaves the spear upright beside him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“For a moment there, I was beginning to think everyone had made you sound more interesting than you really are.”</span>
</div>
<<if $mishanContact.test is "mend_wounds">>
His eyes drift toward Nokai.
There is no anger there.
If the death of one of his own warriors bothers him, he does not show it. The sight appears to amuse him more than offend him.
<<else>>
His gaze passes briefly over the remains of the chair.
There is no irritation in his expression. If anything, the destruction seems to have improved his mood.
<</if>>
Kavnok looks back to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You aren't one to bow, hm?”</span>
</div>
His smile widens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“Good. A proper chieftain shouldn't.”</span>
</div>
He glances toward your people before settling his attention on you again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“That's what disgusts me about most of your little wandering chiefs. They claim the title, then come scurrying to Mishan for favor the moment they're frightened.”</span>
</div>
A quiet scoff escapes him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“The rest spend their time worrying that they've done something to earn my wrath.”</span>
</div>
There is something almost approving in the way he studies you now.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“You aren't like that.”</span>
</div>
Coming from him, the compliment is considerably less reassuring than it ought to be.
You have not frightened Kavnok, nor have you convinced him that the Mishan hold any less power over this region than he believed when he arrived.
But you have done something that may prove considerably more dangerous.
Kavnok pushes his chair back and rises.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kavnok</span>
<span class="dialogue-line">“I think I've seen enough.”</span>
</div>
He takes his spear in hand and looks toward his waiting warriors.
Whatever audience he intended to hold here is over.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_MishanContact_Departure">>
<</button>>
</div><<silently>>
<<set _order = setup.mishan.ensureState().pendingPunitiveRaid>>
<<set _n = _order and !_order.wrath ? setup.mishan.getPunitiveRaidNarrative(_order) : null>>
<</silently>>
<div class="hub-textbox">
<<if _order and _order.wrath>>
<p>A scout crashes into camp at a run, breath coming in ragged gasps.</p>
<p>“Mishan.”</p>
<p>He bends forward for a moment, one hand against his knee, then forces himself upright.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Scout</span><span class="dialogue-line">“Seven warbands. I counted twice. They're all coming here.”</span></div>
<p>For once, nobody answers.</p>
<p>Men around the fire are already reaching for weapons as panic sets in.</p>
<p>Beyond the trees, dust hangs thick over the road. Mishan warriors march beneath it in numbers you have not seen before, their markings raised openly above the column.</p>
<p>You have seen Kavonok send men to punish you before.</p>
<p>This is different.</p>
<p>Those were warnings.</p>
<p><strong>This is punishment.</strong></p>
<<elseif _n>>
<<for _p range _n.opening>><p><<print _p>></p><</for>>
<div class="dialogue-inset"><span class="dialogue-speaker">Scout</span><span class="dialogue-line">“<<print _n.warning>>”</span></div>
<<for _p range _n.closing>><p><<print _p>></p><</for>>
<<else>><p>The warning has reached camp, but the Mishan column can no longer be found.</p><</if>>
</div>
<div class="hub-buttons">
<<if _order and !_order.resolved>><<button "Prepare the Defense">>
<<set $raidCtx = $raidCtx ?? {}>><<set $raidCtx.sourceTribeId = setup.mishan.getTribeId()>><<set $raidCtx.sourceTribeName = "Mishan">><<set $raidCtx._active = true>>
<<set $mishanPunitiveRaidDefenseSetup = $mishanPunitiveRaidDefenseSetup ?? { prepChoice: "base", withdrawPlan: "normal", leader: "yourself" }>>
<<goto "Mishan_PunitiveRaid_Defense_Setup">>
<</button>><<else>><<button "End Event">><<run setup.mishan.finishPunitiveRaidMajor()>><</button>><</if>>
</div><<silently>><<set _order = setup.mishan.ensureState().pendingPunitiveRaid>><<set _valid = _order and _order.raidType is "war_host" and !_order.resolved>><</silently>>
<div class="hub-textbox">
<p>The warning reaches camp before the lookout does.</p>
<p>At first it is only a faint trembling beneath your feet, easy to mistake for distant thunder or the movement of some large herd beyond the trees. Then the vibration comes again, stronger this time, followed by another until loose stones begin shifting across the ground and people throughout the camp stop what they are doing to look east.</p>
<p>The lookout breaks through the trees at a run.</p>
<p>He nearly falls as he reaches the first shelters, catches himself against one of the posts, and pushes onward until he finds you. His face has gone pale, and for several breaths he seems unable to force the words out.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Lookout</span><span class="dialogue-line">“Mishan. Nine warbands. At least nine. I couldn't see past them.”</span></div>
<p>He turns and points back toward the trail.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Lookout</span><span class="dialogue-line">“The whole road is full of them.”</span></div>
<p>By now the trembling beneath your feet has become impossible to ignore.</p>
<p>People begin moving before you give the order. Warriors reach for spears and clubs while families are hurried away from the edge of camp. Somewhere behind you, someone calls for the guards, only to be answered that they are already gathering.</p>
<p>Through the trees, a wall of dust rises above the eastern road. Beneath it comes the dull, steady rhythm of hundreds of feet striking the ground together.</p>
<p>Mishan has known about you for some time. Until now, Kavnok had other concerns demanding his warriors, his attention, and his resources. Whatever else occupied him has finally ceased to matter more than you do.</p>
<p>You had that time to prepare.</p><p>It seems he used his better.</p>
<p>His warbands are already marching toward your camp, and whatever opportunity you once had to choose when this confrontation began is gone. There is only one thing left to do.</p></div>
<div class="hub-buttons"><<if _valid>><<button "Pick up a weapon and fight.">><<set $raidCtx = $raidCtx ?? {}>><<set $raidCtx.sourceTribeId = setup.mishan.getTribeId()>><<set $raidCtx.sourceTribeName = "Mishan">><<set $raidCtx._active = true>><<set $mishanPunitiveRaidDefenseSetup = { prepChoice: "base", withdrawPlan: "normal", leader: "yourself" }>><<goto "Mishan_PunitiveRaid_Defense_Setup">><</button>><<else>><p>The War Host order can no longer be reconstructed.</p><</if>></div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
The elders shuffle out, leaving you alone with the lingering smell of old sweat and unresolved disputes, as per usual. You crack your neck. Finally. Time to go do anything else.
Three figures appear in the entrance.
The hunter is a familiar face. His woman walks beside him carrying a clay bowl covered with ceremonial cloth. Something sloshes inside.
Their daughter stands between them. The fabric does little to hide what lies beneath. Her parents stand on either side, hands on her shoulders, expressions bright with manic enthusiasm.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Mother</span>
<span class="dialogue-line">Chieftain! Great $user!</span>
</div>
The mother thrusts forward a ceremonial bowl, grin stretched wide.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Mother</span>
<span class="dialogue-line">Our daughter has finally come of age! The spirits demand you bless her womb! That she may bear strong children for our people!</span>
</div>
You blink.
The spirits demand this? You are certain you would remember establishing this particular tradition, or that your resident shaman would tell you of one existing beforehand
You turn to Old Morag for clarification. The old woman is already vanishing through a side exit, moving with impressive speed given her age, and clearly not in the mood to deal with this.
The parents look eager. The daughter somewhere between confused and emberassed.
What do you do?
</div>''
<div class="hub-buttons">
<<button "Refuse">>
<<endMajorEvent>>
<</button>>
<<button "Agree to it">>
<<goto "Event_Major_MoonRite_FirstCheck">>
<</button>>
</div><<silently>>
<<set _dc = 13>>
<<set _label = "Endurance">>
<<set _stat = setup.player.getStatForCheck("endurance")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<<set _zealGain = _success ? 13 : 5>>
<<set $zeal = Number($zeal ?? 0) + _zealGain>>
<</silently>>
''<div class="hub-textbox">
Her body arches beneath you. Wet sounds fill the dwelling. Her thighs grip your waist, pulling you deeper with each thrust. Moans spill from her lips, growing louder, more desperate.
The "blessing" builds. Both yours and hers.
<<nsfwimgnew "images/events/moon_rite/second.png">>
<<if _success>>
Divine endurance holds.
You drive through her peak and beyond. Her back arches off the furs. Her walls clench around you, rhythmic and desperate. A cry tears from her throat. Worship and pleasure twisted into one sound.
<<nsfwimgnew "images/events/moon_rite/prep.png">>
Her whole body convulses. Wet heat gushes around you. Her thighs clamp tight, trembling uncontrollably as the blessing completes.
<<nsfwimgnew "images/events/moon_rite/squirt.png">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Young Woman</span>
<span class="dialogue-line">Great One... I am yours... my womb is yours...</span>
</div>
She collapses, breathless and shaking. Eyes glazed with devotion. The parents for their part seem ecstatic. You have a feeling they will speak of this to the rest of the tribe for many nights to come... whether they are interested to hear about it or not.
<<else>>
Your endurance holds steady.
You drive through her peak. Her back arches off the furs. Her walls clench around you in rhythmic waves. A cry tears from her throat as her body shudders beneath you.
The "blessing" takes root. Her thighs tremble, her breath comes in ragged gasps, her eyes unfocus with satisfaction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Young Woman</span>
<span class="dialogue-line">Chieftain... I am yours... my womb is blessed...</span>
</div>
She collapses, sated. Her parents nod with approval. A successful rite. The tribe will be pleased.
<</if>>
<div class="result-list result-list-check">
<div class="result-line <<if _success>>good<<else>>bad<</if>>">
<span class="label">Endurance check</span>
<span class="value"><<if _success>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line good">
<span class="label">Zeal</span>
<span class="value">+<<print _zealGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Let the rite stand.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _dc = 8>>
<<set _label = "Endurance">>
<<set _stat = setup.player.getStatForCheck("endurance")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<<if !_success>>
<<set $zeal = Number($zeal ?? 0) - 3>>
<</if>>
<</silently>>
''<div class="hub-textbox">
The ritual begins. She lies back on the sacred furs, thighs parting, her body presented for blessing.
You start the rite. Her breath comes faster. Her hips rise to meet you. Soft moans escape her lips, growing louder with each thrust.
<<nsfwimgnew "images/events/moon_rite/first.png">>
<<if _success>>
Your focus holds.
She whimpers prayers between gasps. Her fingers grip the furs. Her body trembles beneath you, building toward something sacred.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Young Woman</span>
<span class="dialogue-line">Cheiftain... please...</span>
</div>
<<nsfwimgnew "images/events/moon_rite/first1.png">>
The first wave of the "blessing" approaches. You maintain your divine endurance. And the parents excitment seems to grow with each movment
<<else>>
Then your focus wavers.
Your mind drifts. The council meeting. The hunting disputes. Whether you remembered to eat. Her movements slow beneath you, confusion crossing her face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Young Woman</span>
<span class="dialogue-line">Chieftain... have I displeased you?</span>
</div>
You pull back. The ritual remains unfinished. She sits up slowly, cheeks flushed with embarrassment and a look of dissapoitment graces the Parents faces. Wheter at you or their daughter you arent sure.
The blessing was incomplete.
<</if>>
<div class="result-list result-list-check">
<div class="result-line <<if _success>>good<<else>>bad<</if>>">
<span class="label">Endurance check</span>
<span class="value"><<if _success>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<<if !_success>>
<div class="result-line bad">
<span class="label">Zeal</span>
<span class="value">-3</span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<if _success>>
<<button "Continue the rite">>
<<goto "Event_Major_MoonRite_FinalCheck">>
<</button>>
<<else>>
<<button "Call the rite incomplete.">>
<<endMajorEvent>>
<</button>>
<</if>>
</div><<silently>>
/* ===========================
Major Event: The Moving Mountain - Updates quest text - Creates an expedition ON the current camp tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Update quest + pin expedition to CURRENT camp tile */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Moving Mountain">>
<<set $quests[_qIndex].desc = "After relocating the camp, you spotted it in the distance—an unnaturally smooth hill with even proportions, blanketed in grass. The same shape Rutvig described. If it truly moves, this may be the only chance to reach it.">>
<<set $quests[_qIndex].objective = "Use Expedition at your current camp to send a party toward the ‘moving mountain.’">>
/* Expedition is from the current camp tile */
<<set $quests[_qIndex].targetX = $campX>>
<<set $quests[_qIndex].targetY = $campY>>
<<set $quests[_qIndex].expeditionPassage = "Quest_MovingHill_02">>
/* Show the expedition button at camp */
<<set $quests[_qIndex].markerRevealed = true>>
<<set $quests[_qIndex].status = "active">>
<</if>>
/* Consume the relocation-wait flag so it doesn't re-arm */
<<set $questFlags["q_moving_hill_01_waitRelocate"] = false>>
/* Optional: highlight it */
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
It’s been a long trek, but you’ve finally found a good location for your tribe to set up camp…
<br><br>
As the work around camp continues, whether from boredom or simple vigilance, your eyes begin to wander…
<br><br>
And then you see it.
<br><br>
To most, at this distance, it would look like a normal hill—maybe even a small mountain.
But your eyes know better.
<br><br>
As you stare at its unnaturally even edges, and the grass that blankets its surface, you can’t help but recall the moving mountain you went searching for a few seasons ago.
<br><br>
Perhaps it’s time to send out another search party.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated</span>
<span class="value">A new lead: the moving mountain</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Keep an eye on that hill.">>
<<endMajorEvent>>
<</button>>
</div><<print setup.newPairing.renderEventHtml()>><<silently>>
<<run setup.finishNostalgiaEntryTransition()>>
<<run setup.stopAllAudio ? setup.stopAllAudio() : null>>
<<run setup.playIntro()>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _artifactName = _ev?.data?.sourceArtifactName ?? "memory artifact">>
<<set _memoryHits = Number(_ev?.data?.normalHits ?? 0)>>
<</silently>>
''<div class="intro-creation intro-start-form no-click-sfx nostalgia-opening-fade">
<p>
Sleep comes in fragments. Your body twitches, squirms, refuses you. You reach for something, though you do not know what, and the harder you strain for it the more trapped you feel. Like a prisoner in your own flesh.
</p>
<<if _memoryHits > 0>>
<p>
This is not the first time sleep has come like this. The dreamless nights. The sudden weight behind your eyes. The strange loops of recognition that vanish the moment you try to seize them. They were leading somewhere. Here.
</p>
<</if>>
<p>
The <<print _artifactName>> feels hot enough to burn, though it is not even touching you. Something in you tries to speak. The words are there, right there, caught at your lips, but your body will not obey.
</p>
<p>
With a sharp effort, you force yourself upright—
but your eyes do not open.
</p>
<p>
Still, you see.
</p>
<p>
Not with eyes. Not with anything made of flesh.
</p>
<p>
This place is familiar. Not like a face or a voice is familiar. Something known too deeply to ever be truly forgotten, even when memory slips away from it.
</p>
<p>
This place is familiar. The only place you remember, and the first place you forget.
</p>
<p>
Nothingness. A void without form or substance.
</p>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Try to remember</span>">>
<<goto "Event_Major_Nostalgia_1">>
<</button>>
</div><<silently>>
<<run setup.playIntro()>>
<<set _fakeHair = setup.getNostalgiaCorruption("hair", $hair || "White")>>
<<set _fakeEyes = setup.getNostalgiaCorruption("eyes", $eyes || "Green")>>
<<set _fakeSkin = setup.getNostalgiaCorruption("skin", $skin || "Olive")>>
<<set _fakeHeight = setup.maskNostalgiaHeight($height || 201)>>
<<set _fakeName = "lIlIl">>
<</silently>>
<div class="intro-creation intro-start-form no-click-sfx nostalgia-fake-start">
You exist in nothingness. A void without form or substance, yet here you are—conscious.
Your hair, you recall, was <<listbox "_fakeHair" autoselect>>
<<option "Bl*nd#">>
<<option "W*it#">>
<<option "Br*wn">>
<<option "Gi#g#r">>
<</listbox>>—a beautiful colour.
Your eyes, <<listbox "_fakeEyes" autoselect>>
<<option "Bl*e">>
<<option "R*d">>
<<option "Gr*e#">>
<<option "Br*wn">>
<</listbox>>.
You remember standing <<textbox "_fakeHeight" _fakeHeight>> centimeters tall, your skin, <<listbox "_fakeSkin" autoselect>>
<<option "P*le">>
<<option "B*i#e">>
<<option "Ol*v#">>
<<option "Eb#n#">>
<</listbox>>.
And your name is…
<<textbox "_fakeName" _fakeName>>
<<button "CONFIRM">>
<<goto "Event_Major_Nostalgia_2">>
<</button>>
</div><<silently>><<run setup.startNostalgiaStaticBlend({ durationMs: 18000, introRatio: 0.16, staticRatio: 0.78, introEasePow: 1.45, staticEasePow: 2.75 })>><</silently>>
<div class="intro-creation no-click-sfx">
Yes… of course. The name crystallizes in your consciousness. It has always been yours, long before you ever began.
The fragments gather around it: eyes that have witnessed endings yet to come, hair stirred by winds you remember feeling tomorrow, skin marked by battles you have not yet fought. In that impossible reflection, you see yourself becoming what you already were.
But nothing follows.
No revelation. No comforting truth. No hidden answer waiting just beyond the veil.
Only silence.
At first it feels vast. Like the question. The answer, is just beyond your grasp. Then empty. Then something worse than empty. Something like refusal.
At last, a single thought rises from the nothingness, sharp with urgency, demanding to be known:
<<button "Where are you?">>
<<goto "Event_Major_Nostalgia_3">>
<</button>>
</div><<silently>>
<<script>>
setTimeout(function () {
if (setup && typeof setup.beginNostalgiaBlackoutReveal === "function") {
setup.beginNostalgiaBlackoutReveal({
holdMs: 10000,
audioId: "horsewalk",
audioCueMs: 8000,
audioFadeMs: 6500,
audioRatio: 0.42,
audioEasePow: 1.55
});
}
}, 0);
<</script>>
<</silently>>
<div class="nostalgia-blackout-stage">
<div class="nostalgia-blackout-content">
''<div class="hub-textbox">
<p>Your eyes open as the cart you are riding in hits a bump in the road. Yet you do not have the strength, or the will, to look up. Instead, your focus remains on the floor and the thing you are holding in your arms, hidden by the dirty blanket thrown over you.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">You awake, kid?</span>
<span class="dialogue-bridge">Asks an older man's voice.</span>
</div>
<p>The voice is rough, low, and tired. A man sits opposite you. You can feel his eyes on you even without looking.</p>
<p>You do not answer, nor do you look up. You feel the person's eyes on you for a moment before he turns his head and sighs, seemingly satisfied with leaving it at that.</p>
<p>For a time, there is only the creak of wood, the slow clatter of wheels, and the steady rhythm of hooves against packed earth. Then, after what might have been minutes or an hour, the man speaks again.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">...We'll reach the city in half an hour or so. I'll figure out what to do with you then,</span>
<span class="dialogue-bridge">The gruff voice says.</span>
</div>
<p>Silence follows.</p>
<p>The cart sways. The blanket in your arms shifts. Your fingers tighten around whatever lies beneath it.</p>
<p>Another bit of time passes before he speaks again.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">...So, what are you holding there?</span>
</div>
<p>At first, you do not mean to answer, but the choice is taken from you as the cart hits another bump, larger this time, making your body jump up and what you were holding fall to the cart's floor. Before you can do anything, the man casually reaches down, picks it up, and inspects it. What he sees is...</p>
<div style="display:none">
“You awake, kid?”
asks an older man’s voice. The voice is rough, low, and tired. A man sits opposite you. You can feel his eyes on you even without looking.
You do not answer, nor do you look up. You feel the person’s eyes on you for a moment before he turns his head and sighs, seemingly satisfied with leaving it at that.
For a time, there is only the creak of wood, the slow clatter of wheels, and the steady rhythm of hooves against packed earth. Then, after what might have been minutes or an hour, the man speaks again.
“…We’ll reach the city in half an hour or so. I’ll figure out what to do with you then,”
the gruff voice says.
Silence follows.
The cart sways. The blanket in your arms shifts. Your fingers tighten around whatever lies beneath it.
Another bit of time passes before he speaks again.
“…So, what are you holding there?”
At first, you do not mean to answer, but the choice is taken from you as the cart hits another bump, larger this time, making your body jump up and what you were holding fall to the cart’s floor. Before you can do anything, the man casually reaches down, picks it up, and inspects it. What he sees is…
</div>
<div class="hub-buttons">
<<button "<span class='choice-text'>A little book. (Wisdom + Stewardship)</span>">>
<<set $nostalgia3Choice = "book">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
<<button "<span class='choice-text'>A wooden toy soldier. (Strength + Endurance)</span>">>
<<set $nostalgia3Choice = "soldier">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
<<button "<span class='choice-text'>A smiling mask. (Charisma + Leadership)</span>">>
<<set $nostalgia3Choice = "mask">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
</div>
</div>''
</div>
</div><<silently>>
<<if !$nostalgia3RewardApplied>>
<<if $nostalgia3Choice is "book">>
<<set $wisdom = Math.max(0, Number($wisdom ?? 0) + 1)>>
<<set $stewardship = Math.max(0, Number($stewardship ?? 0) + 1)>>
<<elseif $nostalgia3Choice is "soldier">>
<<set $strength = Math.max(0, Number($strength ?? 0) + 1)>>
<<set $endurance = Math.max(0, Number($endurance ?? 0) + 1)>>
<<elseif $nostalgia3Choice is "mask">>
<<set $charisma = Math.max(0, Number($charisma ?? 0) + 1)>>
<<set $leadership = Math.max(0, Number($leadership ?? 0) + 1)>>
<</if>>
<<set $nostalgia3RewardApplied = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if $nostalgia3Choice is "book">>
<p>He looks it over in his arms for a bit, turning it over as if examining a curious trinket.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Hm. So you can read, then? Or do you just think it looks neat?</span>
<span class="dialogue-bridge">He asks with mild curiosity, before a conclusion seems to hit him, making his next words come out slightly sour.</span>
<span class="dialogue-line">Well... I suppose you had someone to teach you, didn’t you? It isn’t that strange.</span>
</div>
<p>Before you can say anything, something hits your chest as he tosses the book back at you.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Keep it for now. Might teach you something useful.</span>
<span class="dialogue-bridge">He says as his eyes turn to the back of the driver’s head and the road ahead.</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">Wisdom</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Stewardship</span>
<span class="value">+1</span>
</div>
</div>
<<elseif $nostalgia3Choice is "soldier">>
<p>He looks the little soldier over in his hand. As you try to focus on his face, it seems blurry for some reason, but you cannot help feeling that something akin to amusement touches the serious man’s features.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Hmm... A witch hunter figurine. These were popular when I was young, but I haven’t seen them around the markets these days. They have newer stuff... Well, I suppose the Marches still find this sort of thing novel.</span>
</div>
<p>The man’s face turns to you again as he seems to give you a look over.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">You don’t really have the build for it, though. Too scrawny.</span>
</div>
<p>Then you feel something hit your chest as he throws the wooden figurine back at you.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Still, you might make it as a city guard... if you keep at it.</span>
<span class="dialogue-bridge">He says as his eyes turn to the back of the driver’s head and the road ahead.</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">Strength</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Endurance</span>
<span class="value">+1</span>
</div>
</div>
<<elseif $nostalgia3Choice is "mask">>
<p>As the man looks the mask over, you feel him raise an eyebrow, even though you cannot seem to focus on his facial features.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Huh. Now where did you get this...</span>
</div>
<p>He says, his confusion giving way to curiosity as he seems to recognize it. Then you feel something hit your chest as he throws it back to you.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Make sure you get a good look at it if you’re going to keep it. Knowing what a fake smile looks like will help you in life.</span>
<span class="dialogue-bridge">He says as his eyes turn to the back of the driver’s head and the road ahead.</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">Charisma</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Leadership</span>
<span class="value">+1</span>
</div>
</div>
<<else>>
<p>[Somethign went wrong if you are seeing this]</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<unset $nostalgia3Choice, $nostalgia3RewardApplied>>
<<goto "Event_Major_Nostalgia_5">>
<</button>>
</div>''<div class="hub-textbox">
<p>The ride continues, as silence, other than the horses’ hooves and the sound of the cart’s wheels, envelops the cart once more. An hour passes. Then two. Then—</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">There it is.</span>
<span class="dialogue-bridge">The man says, his face turned toward the road ahead.</span>
</div>
<p>Your eyes subconsciously turn in the same direction. And then you see it.</p>
<img src="images/events/nostalgia/home.png" alt="Amogus">
<p class="nostalgia-sleep-trigger">Your eyes, previously unfocused and not looking at anything in particular, widen. You see towers that pierce the sky. Walls that look like mountains. A city that, even this far away, still looks like the biggest thing you have ever laid eyes on. For his part, the man speaks in a casual tone, not sharing your shock or surprise.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">Home, sweet home.</span>
<span class="dialogue-bridge">He mutters, somewhat apathetically.</span>
</div>
<p>As you near the grand city, you simultaneously feel all the tiredness your body has been storing come to claim its due, yet feel unable to look away from the sight before you as you fight to keep your eyes open.</p>
<p>You also feel the man’s eyes on you again. Silently at first, as he seems to observe you. Then he says:</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">???</span>
<span class="dialogue-line">The city is still a ways off, despite how it may look. Sleep. It’s not going anywhere. And you’ll have plenty of chances to get familiar with it...</span>
<span class="dialogue-bridge">He sighs as he looks back to the road.</span>
<span class="dialogue-line">...Whether you want to or not.</span>
</div>
<p>Whether it is because you decide to heed an elder’s advice, or simply because your drowsiness wins out, you feel your body relax in its seat as your eyes slowly close... first comes darkness...</p>
<img src="images/events/nostalgia/home_memory.png" alt="Amogus">
<p>...Then nothing.</p>
</div>''
<div class="hub-buttons nostalgia-sleep-target">
<<button "<span class='choice-text'>Wake up</span>">>
<<goto "Event_Major_Nostalgia_6">>
<</button>>
</div><<silently>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("horsewalk") : null>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<<set _stoneQuestId = "q_strange_stone_secrets_01">>
<<set _stoneQuestResolved = false>>
<<for _stoneQuestIndex = 0; _stoneQuestIndex < $quests.length; _stoneQuestIndex++>>
<<if $quests[_stoneQuestIndex] and String($quests[_stoneQuestIndex].id) is _stoneQuestId>>
<<if String($quests[_stoneQuestIndex].status) is "active">><<set _stoneQuestResolved = true>><</if>>
<<set $quests[_stoneQuestIndex].status = "complete">>
<<set $quests[_stoneQuestIndex].objective = "The stone has revealed another of its secrets.">>
<<set $quests[_stoneQuestIndex].markerRevealed = false>>
<<set $quests[_stoneQuestIndex].targetX = null>>
<<set $quests[_stoneQuestIndex].targetY = null>>
<<set $quests[_stoneQuestIndex].expeditionPassage = "">>
<<break>>
<</if>>
<</for>>
<<set $questFlags["q_strange_stone_secrets_01_done"] = true>>
<<if $trackedQuestIds and $trackedQuestIds.length>>
<<set $trackedQuestIds = $trackedQuestIds.filter(function (id) { return String(id) !== _stoneQuestId; })>>
<</if>>
<<if String($trackedQuestId ?? "") is _stoneQuestId>><<set $trackedQuestId = null>><</if>>
<<set _nostalgiaStoneUpgraded = (setup.strangeStone and setup.strangeStone.upgradeRelic) ? setup.strangeStone.upgradeRelic() : false>>
<<set _nostalgiaPowerLimitGain = 0>>
<<if !$questFlags["major_nostalgia_power_limit_granted"]>>
<<set $powerLimitMax = Number($powerLimitMax ?? 1) + 1>>
<<set $questFlags["major_nostalgia_power_limit_granted"] = true>>
<<set _nostalgiaPowerLimitGain = 1>>
<</if>>
<</silently>>''<div class="hub-textbox">
<p>You jump up and sit at the edge of the furs you were lying on, your body covered in sweat. You quickly look around, only to confirm that you are back in your own body, lying in your tent.</p>
<p>After a moment passes, the memories of the dream, of the large structure you saw, already begin to slowly fade into nothing.</p>
<p>Your breathing calms as you subconsciously reach for the strange stone. As you feel it in your hands, you realise the warmth it had yesterday, or at least the warmth you imagined it had, has disappeared, replaced by a cold quiet, while its purple colours seem to move even in your palm.</p>
<p>After a bit, you put it back before slowly getting up. It is a new day, and as chieftain, that means new work that needs doing...You cant think about forgotten dreams forever.</p>
<<if _nostalgiaPowerLimitGain > 0>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power Limit</span>
<span class="value">+1</span>
</div>
</div>
<</if>>
<<if _nostalgiaStoneUpgraded or _stoneQuestResolved>>
<div class="result-list">
<<if _nostalgiaStoneUpgraded>>
<div class="result-line good">
<span class="label">Relic upgraded</span>
<span class="value">Drained Stone</span>
</div>
<div class="result-line good">
<span class="label">Passive effect</span>
<span class="value">Primary Aspect cap penalty reduced by 1 (maximum Level 3)</span>
</div>
<</if>>
<<if _stoneQuestResolved>>
<div class="result-line good">
<span class="label">Task completed</span>
<span class="value">Secrets of the Strange Stone</span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go about your day</span>">>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("LostTime") : null>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _echoes = setup.oldBones.getEchoesStatus()>>
<</silently>>
''<div class="hub-textbox">
The work should have been ordinary.
Stone. Wood. Clay. Whatever the land is willing to give and your people strong enough to carry back.
Instead, one of the gatherers comes looking for you with a strange look on his face.
He leads you beyond the busiest part of the work, to a shallow cut your people have opened in the earth. Several others are already gathered there, tools forgotten in their hands.
Something pale lies in the exposed ground.
At first, you think it the bones of a child.
Then you crouch beside it to get a better look.
No.
<<cgimg "images/events/old_bones/old_bones.png" "Amogus">>
The body is small, certainly. Even standing, the dead man could not have reached the height of most grown men in your tribe.
But no child was ever built like this.
The ribs are broad. The shoulders thick. Even half-swallowed by hardened earth, the bones of the arms look heavy and dense. The skull is wide through the jaw, its proportions strange without being malformed.
You've seen the bones of grown men before.
This is close.
More than that, the remains are old.
Not the clean bones of last winter's dead, nor even the yellowing remains sometimes found in forgotten caves. Stone has crept into them. Earth clings where flesh should have been. Whatever life once filled this little body ended so long ago that even the bones have begun to become something else.
Yet something still nags at you.
Something about the way he lies here.
Something unfinished.
</div>''
<div class="hub-buttons">
<<if _echoes.canUse>>
<<link "<span class='choice-text'>Reach Into What Remains [Cost: 15 Belief]</span>">><<if setup.oldBones.commitEchoes()>><<goto "Event_Major_OldBones_Echoes_1">><</if>><</link>>
<<elseif !_echoes.owned>>
<span class="macro-button disabled" aria-disabled="true" title="Requires Lingering Echoes Power."><span class="choice-text">Reach Into What Remains [Cost: 15 Belief]</span></span>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 15 Belief."><span class="choice-text">Reach Into What Remains [Cost: 15 Belief]</span></span>
<</if>>
<<link "<span class='choice-text'>Study the Strange Remains</span>">><<run setup.oldBones.beginWisdomStudy(false)>><</link>>
</div>''<div class="hub-textbox">
You place one hand against the dead man's ribs.
Cold.
Hard.
Your third eye opens, but for a moment, nothing happens.
You reach deeper.
Your third eye tries to see what remains, but there is so little of it. Barely anything to latch on to.
Still nothing.
The dead are never truly silent to you. Some merely whisper more quietly than others.
But this...
This is closer to trying to see a stone's memories.
Then—
Heat.
Your third eye flashes purple and your head aches beneath a white, hateful sun.
No.
Not your head.
Your steps are short.
Heavy.
Each one drives an ache through legs built thicker than they should be. Your breath comes hard. Sweat crawls beneath layers of clothing made for a colder place, and what little you have already discarded was not enough.
The sun has been your enemy for days.
Perhaps longer.
You do not know the land around you.
The plants are wrong.
The air is wrong.
Even the nights refuse to become properly cold.
You move south.
One foot.
Then the other.
You miss the mountains.
Again.
You wish you were home.
Again.
Again.
Every so often, you look back.
North.
Always north.
Something hangs against your side.
Heavy.
Precious.
A long piece of dark metal wrapped in stained cloth. One end has been shaped for the hand. The other stretches outward into a narrow length before ending in an old, ugly break.
Your father's.
And his father's before him.
You carry it until you cannot.
You blink and the memory shifts.
Your hands are in the dirt.
Broad hands. Short fingers. Nails split and packed with earth.
You dig beneath a low rise, beside a stone cracked almost cleanly through its middle.
The dark metal goes into the ground.
Cloth follows.
Earth.
Stone.
Your hands press everything flat.
You stare at the place for a long time.
You will return.
The certainty of it fills you so completely that, for a moment, it becomes yours as well.
You will return.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Follow the memory...</span>">>
<<goto "Event_Major_OldBones_Echoes_2">>
<</button>>
</div><<silently>><<run setup.oldBones.completeStrangeRemains()>><<run setup.oldBones.revealWhatWeLeaveBehind()>><</silently>>
''<div class="hub-textbox">
When you have had something to eat. Something to drink. Something...
The memory tears.
Pain.
The world turning beneath you.
A hard blow.
Sky.
You try to move and something inside you answers with a pain so deep that your body simply stops trying.
Your breath grows shallow.
The sun is still there.
Still hateful.
Still warm.
Thoughts come apart.
A place you cannot name.
Faces that vanish before you can see them.
Cold air.
Stone.
Then—
Your eye forcefully closes.
Tired.
Needing to rest.
Still, the location remains clear.
The split stone.
The disturbed earth.
The dark metal beneath it.
You know exactly where it is.
Your hand tears away from the fossil.
For several moments, the world around you feels far too large.
Your legs too long.
The air too familiar.
The men around you stare as you rise.
None of them saw what you saw.
None of them walked south beneath that ancient sun.
But the dead man's final certainty remains inside you.
Nearby, beneath earth that has long forgotten the hands which disturbed it, something is waiting.
<div class="result-list">
<div class="result-line bad"><span class="label">Belief</span><span class="value">-15</span></div>
<div class="result-line good"><span class="label">Task Added</span><span class="value">What We Leave Behind</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Find what the dead man left behind...</span>">>
<<if $currentEvent and $currentEvent.id is "major_old_bones">>
<<run setup.oldBones.finishMajor("Event_Screen")>>
<<else>>
<<goto "Hub_1">>
<</if>>
<</button>>
</div><<run setup.oldBones.revealWhatWeLeaveBehind()>>
''<div class="hub-textbox">
Your scouts return with news from the nearby land.
At first, little of what they describe sounds useful.
Old stones.
Uneven ground.
A low rise mostly swallowed by grass.
Then one of them mentions a large stone cracked almost cleanly through its middle.
You stop him.
Have him describe the place again.
A fixed marker.
Hard to mistake.
And sitting along the route you judged most likely.
If the strange little man hid something he meant to reclaim, this is exactly the sort of place he might have chosen.
You know where to search.
<div class="result-list">
<div class="result-line good"><span class="label">Task Updated</span><span class="value">What We Leave Behind</span></div>
<div class="result-line good"><span class="label">Quest Location</span><span class="value">Discovered</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>See what the dead man left behind...</span>">>
<<run setup.oldBones.finishMajor("Event_Screen")>>
<</button>>
</div><<run setup.oldBones.addStrangeRemains()>>
''<div class="hub-textbox">
<div class="result-list">
<div class="result-line bad"><span class="label">Wisdom check</span><span class="value">FAIL</span></div>
<div class="result-line"><span class="label">wisdom + d20 vs DC</span><span class="value"><<print $oldBonesLastWisdomCheck.total>> / <<print $oldBonesLastWisdomCheck.dc>></span></div>
</div>
You remain beside the bones long after the others lose interest.
The proportions are wrong.
That much is obvious.
The age of the remains is obvious too.
Beyond that, every answer seems to create another question.
Dark discolouration stains part of the stone near the body. Natural, perhaps. Or the last trace of something carried against him.
The dead man lies awkwardly, but whether from injury, death, or the slow shifting of earth you cannot tell.
You circle the shallow cut.
Then circle it again.
Nothing joins.
Eventually, you straighten.
The strange little corpse remains exactly what it was when you first saw it.
Dead.
Old.
And silent.
For now.
You order your people not to break the remains apart or bury them beneath fresh waste from the gathering work. Whatever this is, you may want another look.
The dead man has waited longer than you can imagine.
He can wait a little longer.
<div class="result-list">
<div class="result-line good"><span class="label">Quest Location</span><span class="value">Discovered</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Mark the place for later...</span>">>
<<run setup.oldBones.finishMajor("Event_Screen")>>
<</button>>
</div><<run setup.oldBones.upsertWhatWeLeaveBehind(false)>>
''<div class="hub-textbox">
<div class="result-list">
<div class="result-line good"><span class="label">Wisdom check</span><span class="value">SUCCESS</span></div>
<div class="result-line"><span class="label">wisdom + d20 vs DC</span><span class="value"><<print $oldBonesLastWisdomCheck.total>> / <<print $oldBonesLastWisdomCheck.dc>></span></div>
</div>
You remain crouched beside the body.
And look.
Really look.
The size is the first distraction. It is what everyone else sees, and therefore what everyone else talks about.
You force yourself past it.
The dead man did not live here.
There is no grave. No careful arrangement of the body. No tools, ornaments, or offerings placed beside him. He lies where he fell, half-curled against earth that eventually swallowed him.
A traveller, then?
Your eyes move over the hardened remains.
There.
Along one side of the body, the stone is faintly discoloured. Dark traces cling near the hip and cross upward toward one shoulder. Whatever caused them is long gone, but the pattern is too deliberate to be natural.
Something rested against him.
Something long.
Something heavy.
Yet there is nothing here.
You stand.
A man travelling long distances would not carry something so heavy without good reason.
Carrying it this far, then parting with it, is stranger still.
If he abandoned it, he most likely meant to return.
And if he meant to return, he would have hidden it somewhere he could find again.
The dead man could not have gone far afterwards.
You leave the others with the bones and begin walking.
The nearby ground tells its own quieter story. Some approaches are too steep. Others would force a burdened traveller through thick growth or open ground without water.
One route makes more sense than the others.
You follow it.
Not because you know.
Because, one possibility at a time, you remove the places that make no sense.
By the time you stop, days have already passed.
Your gaze settles on the land ahead.
Somewhere nearby.
You are almost certain of it.
Whatever the strange little man left behind, he left it there.
<div class="result-list">
<div class="result-line good"><span class="label">Task Added</span><span class="value">What We Leave Behind</span></div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>See where the trail leads...</span>" "Event_Screen">><<run setup.oldBones.finalizeMajorForLink()>><</link>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_PeaceOath") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<if _entry and !_entry.peaceOathState>><<set _entry.peaceOathState = {}>><</if>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = (_tid and setup.tribes and setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown") : "Unknown")>>
<<set _duration = 8>>
<<set _remaining = (_tid and setup.tribes and setup.tribes.getPeaceOathRemaining) ? setup.tribes.getPeaceOathRemaining(_tid) : 0>>
<<set _isFedMember = (_tid and setup.federation and setup.federation.isMember) ? setup.federation.isMember(_tid) : false>>
<</silently>>
''<div class="hub-textbox peace-oath-text">
<h2>Peace Oath</h2>
<<if !_tribe>>
A delegation waits at the edge of camp, but no one can agree which tribe sent them.
<<elseif _isFedMember>>
The <b><<print _tribeName>></b> already share your federation oath. No separate peace oath is needed; the federation already forbids raids and tribute between your fires.
<<elseif _remaining > 0>>
The oath with <b><<print _tribeName>></b> already stands for <b><<print _remaining>></b> more turn<<if _remaining isnot 1>>s<</if>>.
<<else>>
Envoys from <b><<print _tribeName>></b> arrive with open palms, careful words, and enough witnesses to make the offer serious.
<br><br>
They ask for an oath of peace lasting <b><<print _duration>></b> turns: no raids, no tribute demands, no blood taken between your fires while the promise holds.
<br><br>
It is not friendship exactly. It is restraint given a name.
<</if>>
</div>''
<div class="hub-buttons">
<<if _tribe and !_isFedMember and _remaining <= 0>>
<<button "Accept">>
<<set _entry.peaceOathState.choice = "accept">>
<<goto "Event_Major_PeaceOath_Resolve">>
<</button>>
<<button "Refuse">>
<<set _entry.peaceOathState.choice = "refuse">>
<<goto "Event_Major_PeaceOath_Resolve">>
<</button>>
<<else>>
<<button "Send the envoys on their way.">><<endMajorEvent>><</button>>
<</if>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_PeaceOath") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _st = _entry ? _entry.peaceOathState : null>>
<<set _choice = _st ? (_st.choice ?? "refuse") : "refuse">>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = (_tid and setup.tribes and setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown") : "Unknown")>>
<<if _entry and _st and !_st.applied and _tid>>
<<set _st.applied = true>>
<<set _st.result = setup.tribes.applyPeaceOathOfferOutcome(_tid, _choice)>>
<</if>>
<<set _res = _st ? _st.result : null>>
<</silently>>
''<div class="hub-textbox peace-oath-resolve-text">
<h2>Oath Answered</h2>
<<if !_res>>
The delegation leaves without a clear answer.
<<elseif _choice is "accept">>
You accept the terms from <b><<print _tribeName>></b>. Witnesses repeat the words, and for a time both camps must turn anger aside before it becomes a raid or a demand.
<br><br>
<div class="result-list">
<div class="result-line good"><span class="label">Peace oath</span><span class="value"><<print _res.duration>> turns</span></div>
<div class="result-line good"><span class="label">Hostile actions</span><span class="value">Raid and Tribute blocked</span></div>
<div class="result-line good"><span class="label">Relations</span><span class="value">+<<print _res.relationsDelta>> (<<print _res.relationsBefore>> -> <<print _res.relationsAfter>>)</span></div>
</div>
<<else>>
You refuse the offer. The envoys from <b><<print _tribeName>></b> keep their composure, but the careful hope they carried dies before they leave your fire.
<br><br>
No oath is sworn today.
<div class="result-list">
<div class="result-line bad"><span class="label">Relations</span><span class="value"><<print _res.relationsDelta>> (<<print _res.relationsBefore>> -> <<print _res.relationsAfter>>)</span></div>
<div class="result-line bad"><span class="label">Peace oath</span><span class="value">Not established</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the answer stand.">>
<<endMajorEvent>>
<</button>>
</div><<print setup.quietDeath.renderEventHtml()>><<print setup.quietDeath.renderResultHtml()>><<silently>>
<<run setup.traditionEvents.startQuest("restless")>>
<</silently>>
''<div class="hub-textbox">
Walking through camp, you quickly notice that the usual rhythm has begun to falter.
Hunters linger near the edge of the settlement, staring toward distant hills. Gatherers complain that the nearby land has grown dull and picked-over. Even simple chores seem to drag, interrupted again and again by talk of supposed better ground just beyond the horizon.
For a people used to movement, staying too long in one place seems to feel quite constraining.
<div class="result-list">
<div class="result-line good">
<span class="label">Task added</span>
<span class="value">Itchy Feet</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "To move is to live">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_scattered_stores") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _data = (_entry and _entry.event) ? (_entry.event.data ?? {}) : ($lastScatteredStores ?? {})>>
<<set _foodLoss = Math.max(0, Math.floor(Number(_data.foodLoss ?? 0)))>>
<<set _resourcesLoss = Math.max(0, Math.floor(Number(_data.resourcesLoss ?? 0)))>>
<</silently>>
''<div class="hub-textbox">
Your journey finally comes to an end as the tribe reaches the land that will become its new home.
While your people begin setting up camp, small arguments start breaking out among the packed goods. One person blames another for a missing bundle. Someone else swears food was handed to the wrong group. Before long, excuses and accusations are flying faster than anyone can make sense of them.
While it still is not clear who was at fault for what, one thing is clear enough: the tribe lost supplies during the move. It seems your people's settled ways have made them clumsy on the road.
<div class="result-list">
<div class="result-line bad"><span class="label">Lost</span><span class="value"><<print _foodLoss>> Food</span></div>
<div class="result-line bad"><span class="label">Lost</span><span class="value"><<print _resourcesLoss>> Resources</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "You incompetents.">><<endMajorEvent>><</button>>
</div><<silently>>
/* ===========================
Quest spawn + NPC presence checks =========================== */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* ---- NPC presence checks by id (no functions; SugarCube-safe) ---- */
<<set _hasKael = false>>
<<set _hasOutcast = false>>
/* Change these IDs if yours differ */
<<set _KAEL_ID = "npc_kael">>
<<set _OUTCAST_ID = "npc_outcast">>
/* Check $people first */
<<if $people and $people.length>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _KAEL_ID>>
<<set _hasKael = true>>
<</if>>
<<if $people[_i] and $people[_i].id is _OUTCAST_ID>>
<<set _hasOutcast = true>>
<</if>>
<</for>>
<</if>>
/* Fallback to $campNpcs (Interact list) */
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if !$hasKael and $campNpcs[_i] and $campNpcs[_i].id is _KAEL_ID>>
<<set _hasKael = true>>
<</if>>
<<if !$hasOutcast and $campNpcs[_i] and $campNpcs[_i].id is _OUTCAST_ID>>
<<set _hasOutcast = true>>
<</if>>
<</for>>
<</if>>
/* ---- Create the quest once (your widget already prevents duplicates via $questFlags[_qid]) ---- */
<<addQuestAdjacentToCamp
"q_moving_hill_01"
"The Moving Mountain"
"A scout returned from the scouting mission shaken—he swears he found a strange, perfectly-shaped hill… and that it vanished the next day."
"Go to the marked tile and use Expedition."
"Quest_MovingHill_01">>
/* Optional: track it so its marker stands out */
<<set $trackedQuestId = "q_moving_hill_01">>
<</silently>>
''<div class="hub-textbox">
You are approached by one of your tribesmen. The one you sent to scout farther west than the others.
He has been gone for many days, but now he finally returns.
The look on his face is tinged with confusion and fear.
You ask him what’s wrong.
<br><br>
<div class="dialogue-inset">
<span class="dialogue-speaker">Rutvig</span>
<span class="dialogue-line">Chief… I searched the forest further inland like you commanded… but what I found was… strange. There was a mountain—yet unlike any I’ve ever seen before. At first it could be mistaken for an ordinary hill… but its proportions were too even, its edges too smooth. It was covered in grass, as if it were trying to hide the stone beneath… and yet the strangest part is this: when I went back the next day… it was gone.</span>
</div>
He swallows, sounding shaken.
<div class="dialogue-inset">
<span class="dialogue-speaker">Rutvig</span>
<span class="dialogue-line">I was confused. Did I take a wrong turn somewhere? Did I make a mistake? But when I retraced my steps… I’m sure it was the path I took.</span>
</div>
After a moment to steady himself, he continues in a quieter voice:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Rutvig</span>
<span class="dialogue-line">I don’t know what that was, but strange spirits inhabit this land, chieftain.</span>
</div>
With that, he finishes his report and walks off.
<br><br>
<<if _hasKael>>
Kael, who was listening as well, chimes in after the scout disappears, arms crossed.
<br><br>
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Rutvig isn’t one to lie—and he isn’t one to get lost while scouting, either. The only miracles I’ve seen performed, and the only ones I believe in, are the ones you seem capable of, $user… but I’d still take heed of his words.</span>
</div>
<br><br>
<</if>>
<<if _hasOutcast>>
The outcast girl, for her part, raises an eyebrow at the story.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Outcast</span>
<span class="dialogue-line">Moving hills? It does sound similar to some tales my grandmother used to mention… but I don’t know anyone who’s seen it in person.</span>
</div>
<</if>>
Definitely something to think about.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Investigate the moving hill</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Keep an eye on that hill.">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
Another day passes with another successful hunt. As you make your way back through camp in search of something to eat, you spot a familiar figure near the edge of camp.
Kael stands motionless, his gaze fixed somewhere beyond the tree line.
You approach him from behind.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Is something the matter?</span>">>
<<goto "Event_Major_KaelScout_Concern">>
<</button>>
</div><<silently>>
<<set _entry = setup.secondsFavor.getCurrentEntry()>>
<<set _data = setup.secondsFavor.beginEvent()>>
<</silently>>
''<div class="hub-textbox">
<<if !_data>>
The matter has slipped out of reach before you can judge it.
<<else>>
One day, you find yourself walking through the camp, idly watching the tribe go about its business.
Your attention eventually settles on <<print _data.secondName>>, giving orders to a handful of your people. They seem to have taken eagerly to their duties as your Second. Perhaps a little too eagerly.
As the days pass, however, you notice they are not the only one enjoying their new authority.
<<print _data.relatedName>>, <<print _data.relationshipLabel>>, has begun speaking rather proudly of their duties as the tribe's <<print _data.appointedPositionName>>. Giving instructions. Correcting others. Carrying themselves with the confidence of someone who believes the position is unquestionably theirs.
A position you would surely remember giving them.
Most curious.
You approach <<print _data.relatedName>> and ask a simple question.
What, exactly, gave them the idea that they were to hold such a position?
The confidence quickly drains from their face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _data.relatedName>></span>
<span class="dialogue-line">Well... <<print _data.dialogueSource>> told me the tribe needed a <<print _data.appointedPositionName>>, and that I was just the <<print _data.manWoman>> for the job...</span>
</div>
They continue explaining themselves, but somewhere along the way you stop listening.
It seems your dear Second has taken certain liberties with their authority. More specifically, with what they believe they can and cannot do without your permission.
Bold.
For better or worse.
The only question that remains is what you intend to do about it.
<</if>>
</div>''
<div class="hub-buttons">
<<if _data>>
<<button "Give Your Late Approval">>
<<set _entry.secondsFavorState.choice = "approval">>
<<goto "Event_Major_SecondsFavor_Result">>
<</button>>
<<button "Rescind the Position">>
<<set _entry.secondsFavorState.choice = "rescind">>
<<goto "Event_Major_SecondsFavor_Result">>
<</button>>
<<button "Revoke Both Positions">>
<<set _entry.secondsFavorState.choice = "revoke">>
<<goto "Event_Major_SecondsFavor_Result">>
<</button>>
<<else>>
<<button "End Event">><<run setup.secondsFavor.finishCurrentMajor()>><</button>>
<</if>>
</div><<silently>>
<<set _entry = setup.secondsFavor.getCurrentEntry()>>
<<set _choice = (_entry and _entry.secondsFavorState and _entry.secondsFavorState.choice) ? _entry.secondsFavorState.choice : "approval">>
<<set _result = setup.secondsFavor.applyChoice(_choice)>>
<<set _data = _result ? _result.data : null>>
<<set _buttonText = _result and _result.choice is "approval" ? "Leave Them to Their Work" : (_result and _result.choice is "rescind" ? "Authority Clarified" : (_result and _result.choice is "revoke" ? "Now to Find a New Second..." : "End Event"))>>
<</silently>>
''<div class="hub-textbox">
<<if !_result>>
The matter has slipped out of reach before you can judge it.
<<elseif _result.choice is "approval">>
You sigh. Perhaps inwardly, perhaps not, before giving a simple nod and turning to leave.
So what if <<print _data.secondName>> appointed <<print _data.relationshipLabel>> as the tribe's <<print _data.appointedPositionName>>? You named them your Second for a reason. Someone has to deal with the smaller matters of camp life while your attention is turned toward things of greater importance.
Perhaps they overstepped.
Or perhaps you simply failed to make the boundaries of their authority clear enough.
Either way, you have better things to do than tear down a perfectly serviceable appointment merely because it was made without your hand directly guiding it.
You leave <<print _data.relatedName>> where they stand, the position now theirs in truth as much as it was in boast.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<elseif _result.choice is "rescind">>
You regard <<print _data.relatedName>> coldly for a long moment.
Then you tell them, simply, that they are not the tribe's <<print _data.appointedPositionName>>.
The title was never theirs to claim. If they dare speak of themselves that way again without your appointment, the punishment will be considerably less gentle.
<<print _data.relatedName>> seems to deflate before your eyes. Whatever confidence they carried only moments ago disappears, replaced by a hurried nod and silence.
You turn and walk away.
Their pride is wounded, certainly. You do not doubt <<print _data.secondName>> will feel the insult as well.
They should have considered that before deciding where your authority ended and theirs began.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<<else>>
You nod, but say nothing further.
Instead, you turn to one of the nearby followers and tell them to fetch your Second. Another is ordered to gather the tribe.
By the time <<print _data.secondName>> arrives, a crowd has already begun to form.
Nervousness flickers across their face as they take in the scene.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _data.secondName>></span>
<span class="dialogue-line">Is... something wrong, <<print $user>>?</span>
</div>
You look at them calmly.
Then the back of your hand catches them across the face.
<<print _data.secondName>> hits the ground. It is only by your restraint that their jaw remains where it belongs.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">You</span>
<span class="dialogue-line">Chieftain.</span>
</div>
You correct them calmly.
The camp falls silent.
You let that silence linger.
Then, with the matter finally receiving the attention it deserves, you declare that <<print _data.relatedName>> is not the tribe's <<print _data.appointedPositionName>>.
Nor will <<print _data.secondName>> continue serving as your Second.
Both appointments are ended. Effective immediately.
You turn and walk away, leaving the scene you created to settle behind you.
Having no Second is inconvenient.
Having one who forgets who stands above them is dangerous.
<<print setup.campDispute.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button _buttonText>><<run setup.secondsFavor.finishCurrentMajor()>><</button>>
</div><<silently>>
<<run setup.traditionEvents.startQuest("settling")>>
<</silently>>
''<div class="hub-textbox">
The tribe has grown fond of the land around your camp.
Paths are becoming familiar. Good gathering spots are remembered. Shelters are being reinforced for the long haul. Even the fires seem to burn with a little more certainty here.
Still, fondness is not quite the same as belonging. If your people are given enough time, they may begin to truly make this place their own.
<div class="result-list">
<div class="result-line good">
<span class="label">Task added</span>
<span class="value">Settling In - Remain on this tile for 6 turns.</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Good things take time">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_sprouting_seeds") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<if _entry and _entry.event and !_entry.event.data>><<set _entry.event.data = { traditionLevelId: setup.traditionEvents.getBondsOfFleshLevelId() }>><</if>>
<<set _result = _entry ? setup.traditionEvents.applySproutingSeedsOutcome(_entry) : null>>
<</silently>>
''<div class="hub-textbox">
You return from the hunt still carrying the smell of blood and wet fur with you.
<br><br>
There is something you forgot in the council tent, so you make your way there directly, not bothering to clean yourself first. As you push through the entrance, you nearly collide with a young adult standing just inside.
<br><br>
For a moment, your hand almost moves on instinct.
<br><br>
Then you notice the familiar shape of the jaw. The eyes. The nervous pride. Behind them stand two members of your tribe, watching with the stiff, hopeful silence of parents presenting something precious.
<br><br>
They explain quickly. Their child has come of age, raised beneath the watchful care of a proper union, and now wishes to serve the tribe as an adult.
<br><br>
The young one does their best not to stare at the blood drying across your skin.
<br><br>
<b>New Young Adult follower joins.</b>
<<if _result>>
<div class="result-list">
<div class="result-line good"><span class="label">New follower</span><span class="value"><<print _result.npcName>></span></div>
<div class="result-line good"><span class="label">Age</span><span class="value"><<print _result.ageLabel>></span></div>
<div class="result-line good"><span class="label">Love</span><span class="value"><<print _result.love>></span></div>
<div class="result-line good"><span class="label">Obedience</span><span class="value"><<print _result.obedience>></span></div>
<<if _result.statBonus > 0>>
<div class="result-line good"><span class="label"><<print _result.statLabel>></span><span class="value">+<<print _result.statBonus>></span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "A new face?">><<endMajorEvent>><</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
(Event prose here.)
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>><<npcAlive "npc_outcast_brother">><</silently>>
''<div class="hub-textbox">
A few days after the encounter, after dealing with the men who were pursuing Halona’s brother and getting affairs for the season sorted, you decide to visit her at her tent.
<<if not _npcAlive>>
You find her pacing inside, back and forth, over and over again. She’s been silent ever since the ordeal, and she remains so even now. She has neither mourned nor spoken.
<<if setup.player.getStatForCheck("wisdom") >= 5>>
Yet when she turns and notices you, you see the rims of her eyes are red. The moment she realizes you’ve seen it, she turns her head away.
<</if>>
You stand there for a few moments, waiting for her to speak. She doesn’t. You start to turn around and leave, but then she says, quietly:
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I do not blame you, $user, if that is what you are thinking.</span>
</div>
Her voice is even, her emotions hard to read. She keeps looking off to the side, at nothing at all, as you turn back to face her. She’s silent for another moment, and then you notice the way she’s holding herself, arms wrapped tight around her body, fingers digging in.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I blame Kavonok, and the cowards who bow to him. The ones who sell blood and loyalty for the scraps he promises them, and for the beatings he chooses not to give.</span>
</div>
She falls silent again. You keep staring, whatever you feel hidden behind your eyes, known only to you.
Maybe you’re about to say something. Comfort her. Tell her the strong decide how the world works. Maybe you’re preparing to leave the tent again.
But before you get the chance, she suddenly turns and grabs your arm. Her hand is small, but the grip is firm, full of strength.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Stay.</span>
</div>
She doesn’t look at you directly. She doesn’t let go.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You helped me when most would have left me to die, or helped me and then abandoned me after. You deserve a reward for your efforts.</span>
</div>
She turns and looks at you again. Then she leans in, slowly, bringing her lips up to meet yours.
<<else>>
Yet even before you enter, you hear shouting and unfamiliar swear words. When you glance around, you see the commotion has already drawn a few curious eyes from the camp, even if nobody understands a word of it.
Just as you reach the tent flap, a man stumbles out backwards, one hand raised as if to shield himself from whatever’s inside. You recognize him as the one you saved yesterday.
<div class="dialogue-inset">
<span class="dialogue-speaker">Tiksi</span>
<span class="dialogue-line">Sister, listen to me! It’s fine! I’m fine! You’re fine! Everything worked ou—</span>
</div>
He doesn’t get to finish.
A wooden cup comes flying out of the tent and cracks him in the temple. It hits close to where he’s still healing, splintering on impact. He staggers, trips, and lands hard in the mud right in front of you.
Rubbing his head, he mutters:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tiksi</span>
<span class="dialogue-line">Shunte…</span>
</div>
Then he notices you looking down at him, eyebrow raised. Embarrassment hits him all at once. He scrambles up, talking too fast.
<div class="dialogue-inset">
<span class="dialogue-speaker">Tiksi</span>
<span class="dialogue-line">Ah, $user! I haven’t even had the chance to thank you yet. I apologize for you seeing me like this, and for causing a ruckus. You see, my older sister is quite temperamen—</span>
</div>
A boot to his backside cuts him off and sends him right back into the mud.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I am not temperamental,</span>
<span class="dialogue-bridge">Halona says, her voice calm in a way that promises violence if anyone argues.</span>
<span class="dialogue-line">just because I don’t tolerate fools, Tiksi.</span>
</div>
She steps closer, eyes hard.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">What were you thinking? I told you to run to the camp of Tribe2 and seek refuge with them, and yet I find you still running from Kavonok’s dogs. Why do I have a new scar from a spear-tip on my stomach?</span>
</div>
He opens his mouth, voice naturally meek, pride trying to fight through it.
<div class="dialogue-inset">
<span class="dialogue-speaker">Tiksi</span>
<span class="dialogue-line">I… You were in danger! I didn’t ask you to make a distraction! I was fine, and I wasn’t going to leave my sister to—</span>
</div>
Another kick.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Shut up.</span>
<span class="dialogue-bridge">She exhales through her nose.</span>
<span class="dialogue-line">Just be glad I found someone willing to save your sorry hide, Tiksi.</span>
</div>
Despite her tone, she hauls him up with surprising care, then gives him a short push away from the tent.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Now go lie down. You still haven’t healed.</span>
</div>
He mutters as he starts limping off.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tiksi</span>
<span class="dialogue-line">Well, at this rate I don’t think I ever will…</span>
</div>
Halona doesn’t reply. She just gives him a look that makes him pick up his pace.
Then her glare swings back to you. She grabs your arm and tugs you toward the tent.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You. Inside. Now.</span>
</div>
You comply with the angry woman.
<</if>>
</div>''
<div class="hub-buttons">
<<if not _npcAlive>>
<<button "<span class='choice-text'>Let the situation continue</span>">>
<<goto "Event_Major_TheDayAfter_LetTheSituationContinue">>
<</button>>
<<button "<span class='choice-text'>Stop her</span>">>
<<goto "Event_Major_TheDayAfter_StopHer">>
<</button>>
<<else>>
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_Comply">>
<</button>>
<</if>>
</div>''<div class="hub-textbox">
As you step inside and the tent flap falls closed behind you—cutting off the curious eyes outside. She finally lets go of your hand. She folds her arms across her chest and fixes you with a glare that could strip bark from a tree.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I apologize for my brother. He is a fool, but a pure one. And whether I want it or not, he’s the only family I have left.</span>
</div>
It sounds like she’s about to launch into a tirade, but she stops herself. She draws in a long breath, then lets it out slowly. When she speaks again, her tone is calmer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But that isn’t what matters right now.</span>
</div>
Her gaze hardens as she delivers the next words, stern and precise, like sealing a bargain.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Thank you. What you did saved me… and now my brother.</span>
</div>
Then the sternness slips. Her voice softens. She looks away, as if she can’t hold your gaze for long.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…You did more for us than you had any obligation to. Too much to be chalked up to simple decency. More than we can repay.</span>
</div>
A short silence. A quiet exhale. When she looks back at you, the firm expression has returned.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">But that doesn’t mean I won’t try.</span>
</div>
She crosses her arms again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So. What do you want as your reward? Riches?</span>
<span class="dialogue-bridge">A bitter edge touches her words.</span>
<span class="dialogue-line">Anything my brother was entitled to is out of our hands now, after our tribe betrayed us. If we ever manage to claw it back, you’d have a claim to it… but promising what you don’t have isn’t much, is it?</span>
</div>
She watches you closely.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So. Is there something else you want? My brother and I can work. We can contribute double what your other people do, if that’s what it takes.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Nothing</span>">>
<<goto "Event_Major_TheDayAfter_Nothing">>
<</button>>
<<button "<span class='choice-text'>You</span>">>
<<goto "Event_Major_TheDayAfter_You">>
<</button>>
</div>''<div class="hub-textbox">
The fabric of the tunic hits the floor, followed quickly by the rustle of her leggings. Halona stands before you exposed, her skin flushed a dark, angry pink against the flickering candlelight.
She doesn't wait for you to admire the view. Her hands are on your chest, shoving you backward with surprising force. You stumble, the backs of your knees hitting the edge of the sleeping pallet before you fall onto the rough wool blankets.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t talk,</span>
<span class="dialogue-bridge">She snaps, straddling your hips before you can fully settle.</span>
</div>
The intrusion is sudden and violent. There is no practised ease in the way she lowers herself onto you, only a stubborn, grinding determination as she forces her body to accept the intrusion.
You feel an immense, unyielding resistance. Her cunt is an incredibly tight sheathe, clamping down on your cock in a panic reflex as the thick head stretches her open for the first time. It grips you like a vice, the heat searing, the friction intense enough to border on pain.
Her breath hitches, a sharp intake of air through her nose, but she doesn't stop. She braces her hands harder on your shoulders, her fingernails cutting into the skin, using the leverage to force her hips down. A barrier gives way with a sudden tear, and she sinks fully, impaling herself on your length.
She cries out, a choked sound that she immediately bites back, her teeth sinking into her lower lip until the skin turns white.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Just... just take it,</span>
<span class="dialogue-bridge">She hisses through clenched teeth, her voice strained.</span>
</div>
<<nsfwimgnew "images/events/dayafter/sex1.png">>
You feel the fluttering spasms of her inner walls as they struggle to adjust to the sheer size filling her. It is drowningly tight, a hot, wet pressure that milks your shaft involuntarily.
She doesn't move for a moment, her body trembling violently atop yours. Her eyes are open, staring down at you, but the gaze is hollow. She looks right through you, fixing on a point in the shadows behind your head, dissociating from the sharp ache between her legs.
She starts to move, but there is no rhythm, only jagged, desperate thrusts. She lifts her hips slightly and drops back down, the motion awkward and jarring. You feel every ridge of her insides dragging against your sensitive skin, the lubrication mixing with a thin trace of iron to ease the passage.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Look at me,</span>
<span class="dialogue-bridge">She repeats, but her voice cracks, the command dissolving into a plea.</span>
<span class="dialogue-line">Don’t look away.</span>
</div>
Her hips slam down harder. The sound of skin hitting skin is wet and sharp, echoing in the small space. Her small tits bounce erratically with the force of her movements, the dark nipples pointing stiffly towards the ceiling. Her abdomen flexes, the muscles knotting as she drives herself onto you, using the pain of the penetration to numb whatever is screaming inside her head.
Her cunt constricts around you rhythmically, unwillingly, the natural reaction of a body overwhelmed by stimulation. She feels impossibly tight, like a hot, velvet glove that is too small, squeezing the life out of your dick with every clumsy drop of her hips.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_LetTheSituationContinue_2">>
<</button>>
</div>''<div class="hub-textbox">
Inside her, the walls flex and ripple violently, the tight grip becoming suffocating as her orgasm crashes through her. You feel the sudden rush of hot fluid flooding around your shaft, mixing with the slick lubrication and the thin trace of blood. She shakes uncontrollably, her nails digging into your shoulders hard enough to draw blood, her entire body seizing up in a rigid arc before she collapses forward, her forehead hitting your chest.
The sensation pushes you over the edge. Your balls tighten, drawing up against your body, and a thick rope of cum erupts from the tip of your cock, painting her insides with your seed. You pulse inside her, spurt after spurt filling her up until the excess leaks out around the edges of your joining, dripping down your shaft and soaking into the coarse hair at the base.
.
.
.
For a long moment, the only sound in the tent is breathing. Heavy. Ragged. Uneven.
<<nsfwimgnew "images/events/dayafter/sex2.png">>
Halona lies limp atop you, her body rising and falling against yours. Her skin is fever-hot, sweat-slick where her chest presses to your own, but there is no softness in it. No comfort. Only heat and weight and the slow return of silence.
Then, gradually, she pushes herself upright.
Whatever raw desperation had driven her a moment ago is gone now, wiped clean from her face. What remains is something flatter. Colder. A numbness pulled tight across her features like a second skin.
She lifts herself off you with stiff, careful movements. A trace of what you left inside her follows, running slowly down the inside of her thigh and dripping onto the worn rug below. She does not acknowledge it. If she feels the soreness in the way her legs tremble, she gives no sign beyond the brief tightening of her jaw.
She stoops, snatches up her tunic, and pulls it over her head. The rough fabric falls into place, covering the flushed skin, the trembling in her stomach, the red around her eyes.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">We are even,</span>
<span class="dialogue-bridge">She says.</span>
</div>
Her voice is flat. Not calm. Not angry.
Empty.
She does not look at you.
She turns away instead, crossing the tent on unsteady legs toward the little table where her herbs and carvings lie scattered. Her back is rigid. Closed. She reaches for the waterskin and drinks from it in long pulls, as though washing something out of her mouth. As though the act itself can be swallowed down and buried somewhere deeper.
The tent feels colder now.
The smell of sweat, sex, and blood hangs in the air, stale and sour in the candlelight. Nothing in her posture invites words. Nothing in the set of her shoulders suggests she wants comfort, explanation, or thanks.
She says nothing else.
She only stands there with her back to you, silent and waiting. The meaning is obvious.
Leave.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_NextDay">>
<</button>>
</div><<silently>>
<<set _pid = "npc_outcast">>
<<run setup.campPositions && setup.campPositions.removeNpcAssignments ? setup.campPositions.removeNpcAssignments(_pid) : null>>
/* Remove from CAMP NPC list */
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n and n.id !== _pid)>>
<</if>>
/* Remove from generic people list */
<<if $people and $people.length>>
<<set $people = $people.filter(p => p and p.id !== _pid)>>
<</if>>
/* Clear selection only if it points to her */
<<if $activePersonId is _pid>><<set $activePersonId = null>><</if>>
<<if $selectedPersonId is _pid>><<set $selectedPersonId = null>><</if>>
<<if $personSelectedId is _pid>><<set $personSelectedId = null>><</if>>
<<if $personInfoId is _pid>><<set $personInfoId = null>><</if>>
/* Clear talk/menu state safely */
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<<set _grantedOutcastIdol = false>>
<<if not $outcastIdolRewardGranted>>
<<run setup.inventory.add("outcastIdol", 1)>>
<<set $outcastIdolRewardGranted = true>>
<<set _grantedOutcastIdol = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
After finishing up your work for the day, you end up back in your tent, enjoying a rare moment of peace while a few of your tribe’s women fuss over you—hands working out the stiffness in your shoulders and arms. Being chieftain doesn’t often leave room for rest.
<<nsfwimg "images/events/dayafter/massage.gif">>
The tent flap lifts, and Kael steps in.
He looks at you, taking in the scene without so much as a raised brow. He gives you a small nod and says, flatly:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">$user. The outcast girl you rescued is gone.</span>
</div>
He pauses, watching your face for a reaction, then continues.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">It seems she slipped out during the night. Finnan was on guard.</span>
</div>
He shrugs.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">He took a beating for being lax, of course… but.</span>
<span class="dialogue-bridge">Kael glances out of the tent for a moment.</span>
<span class="dialogue-line">I don’t think it was entirely his fault. Finnan takes his work seriously.</span>
</div>
He looks back at you, and there’s the faintest edge of dry amusement in his voice.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I think it’s just that our chieftain seems to like saving agile foxes.</span>
</div>
He lets that hang for a moment, then reaches into a small hide pouch at his belt as he speaks again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">She gave me something yesterday. I didn’t understand much—her tongue is foreign—but after what’s happened…</span>
</div>
He pulls out a beautiful, intricate wooden carving: a buffalo, sturdy and proud in the grain.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">…I’m guessing this was her way of saying thanks.</span>
</div>
Kael crouches and sets it carefully in the corner of your tent, then straightens.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Either way, I’ve got work around camp to do, $user. Call for me if you need anything.</span>
</div>
And with that, he slips back out, leaving you amid warm hands and quiet murmurs, your thoughts turning over on themselves as your eyes drift back to the buffalo carving.
<<if _grantedOutcastIdol>>
<div class="result-list">
<div class="result-line good">
<span class="label">Item added</span>
<span class="value">Outcast Idol</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Keep the carving.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 10;
V.halonaLoveGain = 10;
})();>>
<</silently>>
''<div class="hub-textbox">
You tell her plainly. You don’t need a reward. Maybe it’s guilt for failing to save her brother. Maybe it was never about payment to begin with.
She stares at you, half shocked, half offended.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t need a—</span>
</div>
She cuts herself off, releases your arm, and takes a step back. When she looks at you again, she’s squinting. The fire is back in her eyes, and in her voice.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t need a reward, he says… Do you take me for a fool?</span>
</div>
She starts pacing the tent again.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So what, you drag me back from the edge of death, you offer to save my brother too… why? Because you’re some Adan Spirit?</span>
</div>
It’s a kind of spirit your people don’t speak of, but the meaning is clear enough from the way she spits the words. You just look at her, expression blank.
She watches you for a moment, like she can’t believe what she’s seeing, then throws her hands out in frustration.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Then why have you been coming to my tent every day, if you weren’t waiting for a reward?</span>
</div>
You still don’t answer. Whatever she reads in your silence—in the look you give her—it takes some of the heat out of her. Her shoulders loosen. Her voice drops.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Shunte.</span>
</div>
A curse in her tongue.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">So I lose one naive fool, and the spirits send me a different kind to take his place. They always did love their jokes.</span>
</div>
She won’t look at you now. She flicks her hand toward the entrance, dismissing you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Alright. You’ve seen whatever it is you came to see. Off with you.</span>
</div>
After a moment, you do as she says. You turn and start to leave.
Just before you step out, your sharp hearing catches something soft behind you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…Thank you.</span>
</div>
As you leave the tent, you find yourself turning the thought over and over. Can you save everyone? Maybe not. Not yet, at least. You can’t promise you won’t make mistakes again. But you can make sure you’re there to deal with the consequences—to shoulder what you can, to lighten what others would otherwise be forced to carry because of your decisions.
You can be there. Always.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let her have the last word.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 15;
V.halonaLoveGain = 15;
})();>>
<</silently>>
''<div class="hub-textbox">
She watches you a moment longer, like she’s waiting for the punchline. When it doesn’t come, surprise slips into her voice despite herself.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…Nothing?</span>
</div>
She turns the word over like it’s unfamiliar, like it has no place here. Her eyes narrow.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I refuse.</span>
</div>
Flat. Final.
You don’t answer. You don’t reach for excuses. You just stand there, calm and unmovable, letting her decide what to do with the silence.
For a heartbeat it throws her off. She takes a step as if to pace, stops, then takes another, as though the tent suddenly isn’t big enough for her temper.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">No,</span>
<span class="dialogue-bridge">She says, sharper now, pointing at you like she can pin you in place with a finger.</span>
<span class="dialogue-line">You don’t get to do that. You don’t pull someone back from the edge, save her brother too, and then act like it cost you nothing.</span>
</div>
Her gaze flicks over your face, searching for something—smugness, hunger, some sign of a hidden cost or desire.
You give her none of it.
That only makes her jaw tighten.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">In my people’s way,</span>
<span class="dialogue-bridge">She says, voice controlled.</span>
<span class="dialogue-line">a debt left hanging turns into rot. It turns into pity. It turns into a leash.</span>
<span class="dialogue-bridge">Her mouth twists.</span>
<span class="dialogue-line">I will not wear that.</span>
</div>
She exhales, slow, as if dragging her anger back under her ribs.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You want nothing,</span>
<span class="dialogue-bridge">She repeats, almost accusing you of it.</span>
<span class="dialogue-line">Fine. Then I will still repay it.</span>
</div>
She steps closer before she seems to realize she’s doing it—close enough that you can feel the heat of her, the sharpness of her breath. Her eyes hold yours and refuse to let go. The tension in the air changes. Not softer, exactly. Just… different. Like her fury is covering something else.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">My brother and I will work,</span>
<span class="dialogue-bridge">She says, and the words come out like a vow.</span>
<span class="dialogue-line">We will contribute. Double, if we have to. Not as guests. Not as burdens. As hands.</span>
</div>
She waits, watching you like she’s daring you to object.
You still don’t speak.
For a moment she looks almost angry at her own reaction to that silence—like it’s unfair that you can unsettle her without even trying.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…So give me something,</span>
<span class="dialogue-bridge">She says, quieter, but no less firm.</span>
<span class="dialogue-line">A task. A rule. A price with a name. Something that closes this.</span>
</div>
Your gaze shifts, just slightly, toward the tent flap and the camp beyond. Not you. Them. The people outside. Your people. Your tribe.
Halona follows your look. She goes still, reading it. Then her shoulders ease a fraction, as if the shape of the world has finally clicked back into place.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…Your tribe,</span>
<span class="dialogue-bridge">She says, and there’s a strange edge to it—half relief, half annoyance.</span>
<span class="dialogue-line">Not you.</span>
</div>
Her eyes return to yours. The fire is still there, but it’s steadier now. Less wild.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Fine.</span>
<span class="dialogue-bridge">She nods once.</span>
<span class="dialogue-line">Then we repay your tribe. We earn our place until no one can call it charity.</span>
</div>
She holds your gaze a second longer than she needs to—long enough to make the air feel tight again. Then she looks away, like she’s the one who has to break it.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Now go,</span>
<span class="dialogue-bridge">She mutters.</span>
<span class="dialogue-line">Before I start arguing with you again.</span>
</div>
You give a small nod and take your leave, your mind turning over the choices you’ve made so far. As you step out of her tent, you can’t help but feel a pair of eyes tracking you until the flap falls shut.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Best not start another argument.</span>">>
<<endMajorEvent>>
<</button>>
</div><div class="hub-textbox">
She hears your answer. For a moment, she says nothing. Then she lets go of your hand and takes a few steps back.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I see,</span>
<span class="dialogue-bridge">She says simply.</span>
</div>
There’s no sting in her voice, no sign of offence. Maybe there would be, under different circumstances...But right now, other things weigh heavier on her mind.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Then if that’s everything, please leave. I’ll find another way to pay you back.</span>
</div>
She turns away again, showing you her back. You do as she asks, and step out of her tent.
</div>
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_NextDay">>
<</button>>
</div>''<div class="hub-textbox">
She hears your answer and looks up at you, weighing it. For a moment she just studies you. Then her eyes flick over you again, like she’s quietly redoing the measure of you in her head.
When she speaks, there’s a spark of the old fire in her voice—brief, but real.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Why?</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>You don’t need a reward</span>">>
<<goto "Event_Major_TheDayAfter_NoReward">>
<</button>>
<<button "<span class='choice-text'>You don’t want her</span>">>
<<goto "Event_Major_TheDayAfter_Reject">>
<</button>>
</div>''<div class="hub-textbox">
Halona stares at you, her brow furrowing deeply as the silence stretches between you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You?</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">What do you mea—</span>
</div>
The realization hits her before the sentence can finish.
Her eyes narrow at once, the brown darkening with a sharp, wounded disdain.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Of course,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">And here I actually thought I’d met an intelligent man for the first time. What a fool I was.</span>
</div>
She turns her head sharply aside, snapping her gaze away from yours and fixing it on the tent wall. Even in the dim candlelight, you can see the dusty pink flush spreading across the bridge of her nose and staining her cheeks. She folds her arms tighter across her chest, as if she can physically hold herself together through sheer stubbornness.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Men are all the same,</span>
<span class="dialogue-bridge">She mutters.</span>
<span class="dialogue-line">Blood, coin, or a body to claim once they think they’ve earned it.</span>
</div>
She practically spits the words, but the force behind them is uneven. Her voice trembles, just slightly.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You save my brother’s life and decide to claim the sister as payment.</span>
<span class="dialogue-bridge">Her mouth twists.</span>
<span class="dialogue-line">How noble. How utterly predictable.</span>
</div>
She still refuses to look at you, but you see her throat work as she swallows. Her fingers tap an erratic rhythm against her own upper arm.
Then, after a moment, she turns back.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Well?</span>
<span class="dialogue-bridge">She snaps. Her chin is high, her eyes bright with a defensive anger that doesn’t quite hide what sits beneath it.</span>
<span class="dialogue-line">Come here, then. I said I pay my debts. I won’t have you saying I welched on a bargain.</span>
</div>
She does not wait for you to move.
She steps forward herself, closing the distance in one jerky, aggressive motion. Her hands fist in the fabric of your tunic.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Just…</span>
<span class="dialogue-bridge">She says, and for the first time the words catch.</span>
<span class="dialogue-line">Don’t expect me to be graceful about it.</span>
</div>
Then she rises onto her toes and presses her mouth to yours.
It is hard and clumsy, more collision than kiss. You taste mint and the bitter trace of herbs.
Her teeth click against yours, sharp and sudden, and for a moment her whole body goes rigid with the effort of forcing herself not to pull away. But she stays there.
She makes herself stay there, lips pressed to yours, breath unsteady, her grip on your tunic tightening as though stubbornness alone will carry her through it.
When she finally pulls back, she does it abruptly, drawing in a quick breath. Her chest rises and falls against yours. Her lips are wet, slightly swollen.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">That was terrible,</span>
<span class="dialogue-bridge">She mutters, wiping her mouth with the back of her hand.</span>
</div>
Then, after the briefest pause:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">…So stop looking at me like that.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_You_2">>
<</button>>
</div>''<div class="hub-textbox">
Her hands drop to your waist, fumbling clumsily with the laces of your trousers.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I've never done this before, so if you laugh, I'll knife you. I swear it.</span>
</div>
She finally manages to undo the knots, pushing the rough fabric down. Your cock springs free, thick and heavy, bouncing slightly from the movement. Halona stares at it, her eyes going wide. The flush on her cheeks deepens to a dark crimson, and she doesn't look away. She can't seem to look away.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Gods,</span>
<span class="dialogue-bridge">She breathes out, the word barely a whisper.</span>
<span class="dialogue-line">It looks... angry. And huge.</span>
<span class="dialogue-bridge">She swallows visibly, her Adam's apple bobbing in her slender throat.</span>
<span class="dialogue-line">You really expect me to fit that in my mouth?</span>
</div>
She drops to her knees on the woven rug, looking up at you with a mixture of apprehension and a strange, hesitant hunger.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I'm doing this for my brother,</span>
<span class="dialogue-bridge">She mutters, though her voice lacks conviction now.</span>
</div>
She reaches out with both hands.
Her palms are rough, calloused from years of archery, but her touch is hesitant, almost reverent. She wraps her fingers around your girth, her grip unsure. She gives a soft squeeze, feeling the hard heat of you against her skin, and a shiver runs through her shoulders.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It's like holding a rock wrapped in skin,</span>
<span class="dialogue-bridge">She whispers, leaning closer without realizing it.</span>
</div>
She starts to stroke you, her movements experimental. Her hand glides up the shaft, her thumb brushing over the leaking slit, smearing the sticky pre-cum over the head. She watches the fluid bead up again, biting her lower lip, fascinated by the visceral reaction she's pulling from you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Is that... good?</span>
<span class="dialogue-bridge">She doesn't give you time to answer.</span>
<span class="dialogue-line">Don't tell me. I don't care. Just... make a noise if you aren't bored.</span>
</div>
She leans in closer, the scent of her arousal mixing with the smell of the tent. She sticks her tongue out, giving the head a tentative lap. She recoils slightly at the taste, then leans back in, eyes narrowing in concentration.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Salty.</span>
</div>
She opens her mouth wide, her jaw stretching as she guides the tip past her lips. The wet heat of her mouth engulfs you, intense and sudden. She takes only the head at first, sucking tentatively, her tongue pressing awkwardly against the sensitive underside.
<<nsfwimgnew "images/events/dayafter/blowjob1.png">>
Her hands continue to work the base, twisting slightly as she tries to find a rhythm. It is messy and unpracticed, saliva pooling at the corners of her mouth and dripping down her chin.
She makes a low, frustrated noise in the back of her throat and tries to take you deeper, choking immediately as your cock hits the back of her throat. Her eyes water, but she pulls back only slightly, determination hardening her features as she bobs her head, taking you a little deeper with every attempt, her annoyance at her own clumsiness mixing with a growing desire to take all of you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_You_3">>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 10;
V.halonaLoveGain = 10;
})();>>
<</silently>>
''<div class="hub-textbox">
Halona’s mouth is a hot, chaotic mess around your shaft. She doesn't have the skill to make this art, but she attacks the task with a fierce determination that makes up for it. Her tongue swirls unpredictably over the sensitive ridge of your cockhead, while her hand pumps the base in a tight, slippery fist.
She pulls back to gasp for air, saliva dripping from her swollen lower lip to her chin.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You're twitching,</span>
<span class="dialogue-bridge">She accuses, her voice coming out rough and wet.</span>
</div>
You almost seem to detect a hint of pride in her voice. She dives back down, taking you deep enough to choke herself.
The wet, gagging sound vibrates through your groin. You feel the pressure spike instantly. Your balls tighten, and the first thick rope of cum erupts directly into her throat. She jerks back in surprise, coughing. Your cock slips from her lips, pulsing violently.
The next few spurts stripe across her face. Hot, thick lines of white splashing over her cheek, nose, and into her dark eyelashes. Some lands on her lower lip, hanging there for a moment before dripping onto her chest.
<<nsfwimgnew "images/events/dayafter/blowjob2.png">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Gods!</span>
<span class="dialogue-bridge">She sputters, wiping her eye with the back of her hand.</span>
</div>
She stares at the mess coating her face with wide, shocked eyes, looking down at the sticky fluid cooling on her skin.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">It just... keeps coming.</span>
</div>
She snatches up a rough cloth from a nearby crate and scrubs at herself with harsh, irritated strokes, as though force alone can erase what just happened. The flush on her cheeks burns darker than ever, spreading all the way to her ears. Even as she wipes herself clean, you catch her glancing once at the damp smear on the cloth—a strange, unwilling flicker of curiosity crossing her face before she crushes it flat.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You’re impossible,</span>
<span class="dialogue-bridge">She mutters.</span>
</div>
The words come out sharper than they need to, but there’s no real venom behind them. Only embarrassment, trying to dress itself up as anger.
She rises quickly and adjusts her tunic, tugging the fabric back into place with short, rough motions. By the time she turns away, her posture has gone rigid again, her arms folding tight across her stomach like a shield.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">We are even,</span>
<span class="dialogue-bridge">She says.</span>
</div>
Her voice is steadier now, but she still won’t look at you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">My brother is safe. And I…</span>
<span class="dialogue-bridge">She hesitates, just for a moment, then forces the words out.</span>
<span class="dialogue-line">I did what you asked.</span>
</div>
She glances back over her shoulder, eyes narrowed in warning, though the red still lingering in her face dulls some of the effect.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t mistake this for anything else,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">And don’t start thinking you can come back here whenever the urge strikes you. I am not one of your playthings to be summoned when it suits you.</span>
</div>
She jerks her chin toward the tent flap.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Go.</span>
</div>
Then, after the briefest pause, more quietly:
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I need to clean myself properly.</span>
</div>
Whether you want to answer, tease her, or simply leave the moment where it lies, in the end you step out into the open air and leave her alone with her thoughts—and the aftermath she refuses to let you see.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Give her some privacy.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = setup.theMorningCount.getCurrentEntry()>>
<<set _state = setup.theMorningCount.ensureState(_entry)>>
<<set _data = _state ? _state.data : {}>>
<<set _npcName = _data.npcName ?? "the absent follower">>
<</silently>>
''<div class="hub-textbox">
<br>The morning count begins soon after dawn.
One by one, the people of the camp gather near the central fire. Names are marked against familiar faces. The day’s work is divided, absences noted, and the tribe’s stores compared against the previous count.
The routine is still new enough to draw complaints. Some appreciate knowing what must be done and who is responsible for it. Others linger at the edge of the gathering, plainly irritated at being expected to account for themselves each morning.
Today, one person is missing.
<<print _npcName>> has not appeared, and no one seems to know where they have gone. That alone would be an inconvenience.
The stores make it something worse.
<<if _data.materialType is "food">>
Several baskets are missing from where they were recorded the previous evening. Some contained dried meat, others roots and gathered plants. They may have been moved, taken for another task, or simply counted incorrectly.
Until they are found, the tribe has no choice but to treat them as lost.
<<else>>
Part of the camp’s materials cannot be accounted for. Split timber, stone, hides, and cord are missing from the piles where they were recorded the previous evening. They may have been moved, taken for private work, or simply counted incorrectly.
Until they are found, the tribe has no choice but to treat them as lost.
<</if>>
<<if _state>>
<div class="result-list">
<div class="result-line bad"><span class="label">Lost</span><span class="value"><<print _state.actualLoss>> <<print _data.materialLabel>></span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Conduct the count personally.">><<run setup.theMorningCount.recordChoice(_entry, "stewardship")>><<goto "Event_Major_TheMorningCount_Stewardship">><</button>>
<<button "Make an example of the absent.">><<run setup.theMorningCount.recordChoice(_entry, "discipline")>><<goto "Event_Major_TheMorningCount_Discipline">><</button>>
<<button "Excuse the absence.">><<run setup.theMorningCount.recordChoice(_entry, "excuse")>><<goto "Event_Major_TheMorningCount_Excuse">><</button>>
</div><<silently>>
<<set _entry = setup.theMorningCount.getCurrentEntry()>>
<<set _result = setup.theMorningCount.applyDiscipline(_entry)>>
<<set _state = setup.theMorningCount.ensureState(_entry)>>
<<set _npcName = _state ? (_state.data.npcName ?? "the absent follower") : "the absent follower">>
<</silently>>
''<div class="hub-textbox">
You allow the lost stores to remain lost.
Recovering them is no longer the lesson you intend to teach.
When <<print _npcName>> finally returns, they are brought before the others. Whether their absence directly caused the missing supplies matters less than the fact that the count failed when someone chose not to attend it.
You make the consequence public.
Their duties are increased, their objections dismissed, and the rest of the camp is left with little doubt that the morning count is not a suggestion.
<<print _npcName>> accepts the punishment poorly, but they accept it.
The missing stores are not recovered.
The authority behind the routine is.
<<if _result>><<print setup.theMorningCount.resultRowsHtml(_result.rows)>><</if>>
</div>''
<div class="hub-buttons">
<<button "Let the lesson sink in.">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = setup.theMorningCount.getCurrentEntry()>>
<<set _result = setup.theMorningCount.applyExcuse(_entry)>>
<<set _state = setup.theMorningCount.ensureState(_entry)>>
<<set _npcName = _state ? (_state.data.npcName ?? "the absent follower") : "the absent follower">>
<</silently>>
''<div class="hub-textbox">
You refuse to punish <<print _npcName>> for failing to attend.
Their reasons are heard, and the matter is allowed to pass without consequence. Relief is plain on their face. Several others appear pleased that one missed count will not be treated as open defiance.
The gathered tribespeople are released soon afterward.
The missing stores remain missing, but no further time is spent searching for them. Work resumes, and <<print _npcName>> returns to their usual place among the others without public shame or added duties.
The decision preserves goodwill.
It also leaves the camp wondering how seriously the next morning count must be taken.
<<if _result>><<print setup.theMorningCount.resultRowsHtml(_result.rows)>><</if>>
</div>''
<div class="hub-buttons">
<<button "Let it slide.">><<endMajorEvent>><</button>></div><<silently>>
<<set _entry = setup.theMorningCount.getCurrentEntry()>>
<<set _result = setup.theMorningCount.applyStewardship(_entry)>>
<<set _state = setup.theMorningCount.ensureState(_entry)>>
<<set _data = _state ? _state.data : {}>>
<</silently>>
''<div class="hub-textbox">
You take control of the count yourself.
The gathered tribespeople are kept in place while every name, task, and store is checked again. Those who moved supplies are made to retrace their steps. Those who borrowed tools or materials are questioned about where they left them.
<<if _result>>
<div class="result-list result-list-check">
<<if _result.success>>
<div class="result-line good"><span class="label">Stewardship check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Stewardship check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label">Stewardship + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
</div>
<</if>>
<<if _result and _result.success>>
The confusion gradually begins to clear.
<<if _data.materialType is "food">>
One basket was taken to another fire and never returned. Another was placed beneath a shelter to keep it out of the night air. The remaining food is found divided between several smaller stores, each moved without anyone thinking to inform the others.
By the time the count ends, everything missing has been recovered.
<<else>>
Some of the materials were taken for repairs that were never recorded. Others were moved aside to clear space or left near unfinished work. Piece by piece, the missing timber, stone, hides, and cord are located and returned.
By the time the count ends, everything missing has been recovered.
<</if>>
The routine took time, but it has done what it was meant to do.
<div class="result-list">
<div class="result-line good"><span class="label">Recovered</span><span class="value"><<print _result.recoveredAmount>> <<print _result.materialLabel>></span></div>
</div>
<<else>>
The count drags on.
Each answer creates another question. One person remembers seeing the missing stores near a shelter. Another insists they were moved toward the edge of camp. Several people admit taking something, but none can agree on what they took or where they left it.
As the morning passes, patience gives way to frustration. People begin drifting toward their usual work, unwilling to spend more of the day repeating the same uncertain answers.
Nothing is recovered.
The count ends with fewer questions answered than when it began.
<</if>>
</div>''
<div class="hub-buttons">
<<button "Call the count finished.">><<endMajorEvent>><</button>></div><<silently>>
<<set _tomaso = setup.tomaso.visit()>>
<<set _tomasoMishanGreeting = setup.tomaso.consumePostMishanGreeting()>>
<</silently>>
''<div class="hub-textbox">
<<if not _tomaso>>
There is no active visit from Tomaso Vellari.
<<elseif not _tomaso.isFirstVisit>>
The lookout barely finishes telling you that a familiar caravan has been spotted before you know who it is.
By the time you reach the edge of camp, the strange long-eared beasts are already lumbering closer beneath their loads. And atop the cart sits an equally familiar figure.
Tomaso Vellari.
<<if _tomasoMishanGreeting>>
Tomaso raises a hand the moment he sees you, the familiar curl already returning to one end of his moustache.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Ah, friend! I hear you've had the... pleasure of meeting Kavnok. A colourful fellow, isn't he?"</span>
</div>
<<if _tomasoMishanGreeting is "hostile">>
His gaze wanders briefly across the camp, taking in the mood around him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Though from the look of things, I see your introduction was rather less cordial than most. Nasty business."</span>
</div>
He turns his attention back to you, his usual easy manner returning.
<<elseif _tomasoMishanGreeting is "compliance">>
<div class="dialogue-inset">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"And you managed to send him away without the whole affair becoming a battle! Very good. That is why we get along so well, friend. You understand a bargain. A man of business! Just like me!"</span>
</div>
He gives the end of his moustache an approving twist.
<<else>>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"And you told him no? Hoho! Brave, friend. Perhaps not what I would call particularly wise... but brave!"</span>
</div>
He gives the end of his moustache an amused twist.
<div class="dialogue-inset">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Still, Kavnok walked away and you are standing here talking to me. There are certainly worse outcomes."</span>
</div>
<</if>>
Tomaso's expression settles back into its usual easy cheer.
<div class="dialogue-inset">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"And if your dealings with our colourful friend ever leave you needing something, remember me. Goods, information, introductions... whatever it may be, you need only ask."</span>
</div>
He spreads his hands with familiar theatricality.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Tomaso Vellari remains, as always, at your service."</span>
</div>
<<else>>
The trader raises one hand the moment he sees you, the other already curling the end of his moustache.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">
<<switch _tomaso.greeting>>
<<case 0>>"My friend! Still alive, still prosperous, and, I hope, still in need of things only I can provide!"
<<case 1>>"Hoho! There you are! I was beginning to worry the western wilderness had finally eaten my best customer."
<<case 2>>"Friend! Good news. I have returned richer, wiser, and burdened with even more things you didn't know you wanted."
<<default>>"Ah! A familiar face. Come, come. Let us see whether your stores or my generosity run dry first."
<</switch>>
</span>
</div>
<</if>>
The caravan comes to a halt near the edge of camp. Tomaso descends from his cart with the same lack of haste as always.
Behind him, bundles are lowered, unfamiliar goods uncovered, and the business of trade begins.
<<else>>
One of the camp lookouts comes hurrying toward you. Not running in panic. Close enough.
He slows only when he reaches you, breathing heavily.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">"Chief! We saw someone. A group."</span>
</div>
He points toward the edge of camp.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">"Hard to see them properly from this far out, but there must be a dozen of them. And they're all wearing... strange clothes."</span>
</div>
You raise an eyebrow and ask how quickly they are approaching.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">"Not very."</span>
</div>
He glances back toward the treeline.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Lookout</span>
<span class="dialogue-line">"They've noticed us. They're coming this way, but slowly. Maybe they want to trade?"</span>
</div>
You sigh. Then walk past him.
A few shouted commands are enough. Men rise from beside the fires. Spears are taken from racks. Those nearest the edge of camp spread out in practiced motions, not yet threatening, but making certain the strangers understand they have been seen.
You move ahead of them. The lookout was right.
A group approaches in the distance. Slowly. Very slowly.
At first you make out little beyond movement and colour. Then shapes begin to separate.
People. Animals. Something wooden rolling between them.
You cross your arms and wait.
The closer they come, the stranger they become.
Their clothing is the first thing that stands out. Not fur. Not hide.
Something smoother, thinner, woven so tightly that the individual strands are difficult to distinguish at a distance. Cloth in shades your people rarely manage deliberately, cut into shapes that fit closely around arms and legs.
Several of the strangers wear small pieces of metal openly. Buckles. Rings. Pins. Little ornaments polished until they catch the light.
Too many. Too deliberate.
These are not lucky scraps found in the earth. Nor are they things made with tools known to your tribe.
Then there are the animals.
Four-legged beasts with long faces and enormous ears, burdened beneath sacks and bundles. They resemble some of the grazing animals you have seen across the plains, but only distantly.
You have never hunted anything quite like them.
One pulls the wooden object you noticed earlier. A platform on wheels. Loaded heavily with bundles, sealed containers, baskets, and things covered beneath cloth.
At its front sits a man upon a raised wooden seat padded with fabric. A throne, perhaps. Though an unusually small one.
And an even stranger chieftain.
Four of the approaching group carry weapons and move like they know how to use them. Others guide the animals or tend to the cargo. Several more trail behind.
Adults. Poorly dressed compared to the others. Unarmed.
A few wear cords or metal bands that make their place in the caravan clear enough, even if the custom itself is unfamiliar.
The man upon the wooden throne appears to command them all.
When the caravan finally reaches the edge of camp, it slows to a stop. Your assumption proves correct.
The seated man says something to one of his attendants, then begins the difficult process of climbing down. It takes him longer than expected.
He is tall. Large too. But not in the way of your warriors, where fat gathers around muscle hardened by hunts, marches, and violence.
<<cgimg "images/events/tomato/tomato.png" "Tomasos Glory">>
With this man, the fat seems mainly to conceal more fat. His stomach strains comfortably against his clothing. His cheeks are round. His fingers are covered in rings.
And his beard...
No. Calling it a beard would be an insult to beards everywhere.
His cheeks and chin have been scraped almost completely smooth, leaving his face bare like that of an adolescent. With one exception.
A magnificent moustache stretches across his upper lip, thick enough to make up for everything missing beneath it. Both ends have been trained upward into deliberate curls.
The man approaches. Five steps from you, he stops. Then smiles. Broadly.
One hand rises to his moustache. Two fingers begin idly twisting one of its ends.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Strange Chieftain</span>
<span class="dialogue-line">"Friend! Trade, yes?"</span>
</div>
Your eyebrows rise. Not because you fail to understand him.
That almost never happens. Others sometimes struggle with distant tribes and unfamiliar words. You rarely do. Meaning has always reached you with an ease you stopped questioning long ago.
But the man's meaning is... limited. Broken. The words themselves feel clumsy in his mouth.
For a moment you wonder if he is simple-minded. No. His eyes are too alert for that.
He is speaking the tongue used by the people of these lands. He simply does not know much of it.
You ask him his name.
The effect is immediate. The fingers twisting his moustache stop. His smile disappears. His eyes widen.
For perhaps the first time since arriving, the man looks genuinely caught off guard. Then the smile returns. Larger than before.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Strange Chieftain</span>
<span class="dialogue-line">"Hoho!"</span>
</div>
His hands spread dramatically.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Strange Chieftain</span>
<span class="dialogue-line">"But where are my manners? Where are my manners!"</span>
</div>
The awkward western speech is gone. The words that follow are effortless. Clear. Natural.
The man takes one step backward, sweeps an arm across his stomach, and bends into an elaborate bow. Deeply.
Far deeper than any chieftain with pride would willingly bend before a stranger. Yet nothing about the gesture feels submissive. It has been practiced too many times for that.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Tomaso Vellari, proprietor of the Vellari Trading House, citizen of Velassa. At your service!"</span>
</div>
He rises with unnecessary flourish. His fingers immediately return to his moustache.
Most of what he has just told you means very little. A trading house. A citizen. Words you understand without truly understanding what sort of world requires them.
The trader, meanwhile, appears delighted.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"To think I would hear Veyran spoken here!"</span>
</div>
He studies you with open curiosity.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"That's a first. You western tribesmen rarely go beyond the Serradine Mountains, and you certainly aren't known for seafaring..."</span>
</div>
His voice trails off. The moustache stops turning again.
For a moment he seems to be considering the problem seriously. How?
You interrupt his little investigation by asking what he wants. He blinks.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Hm?"</span>
</div>
Then comprehension returns. So does the grin.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"What I want?"</span>
</div>
He presses a hand theatrically to his chest.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Oh, my friend, that doesn't matter at all! My wants are small. Inconsequential!"</span>
</div>
He turns and gestures toward the caravan behind him. Toward the laden animals. The wooden cart. The bundles. The unfamiliar goods. And the people waiting among them.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"What matters is what you want, my friend. Now is the time to name it!"</span>
</div>
His arms spread wider.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Because so long as it exists somewhere beneath the sun, Tomaso Vellari surely has it!"</span>
</div>
He pauses. Just long enough for the claim to settle.
Then the curled end of his moustache receives another turn.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Just say the word, and my caravan will open for your viewing pleasure."</span>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Trade with Tomaso">><<goto "Event_Major_Tomaso_Trade">><</button>>
<<button "Send him away">><<run setup.tomaso.sendAway()>><<goto "Event_Major_Tomaso_Resolve">><</button>>
<<button "Kill him and seize the caravan">><<run setup.tomaso.kill()>><<goto "Event_Major_Tomaso_Resolve">><</button>>
</div><<silently>>
<<set _v = setup.tomaso.visit()>>
<<if _v and _v.outcome is "services">><<run setup.tomaso.applyServicesReward()>><</if>>
<<set _endLabel = "End Event">>
<<if _v>>
<<if _v.outcome is "killed">>
<<set _endLabel = "Business concluded.">>
<<else>>
<<set _endLabel = "Until next time, merchant.">>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if not _v>>
There is no active visit from Tomaso Vellari.
<<elseif _v.outcome is "dismissed">>
You tell Tomaso that you have no interest in his wares.
For several moments, he simply stares at you. His fingers stop turning his moustache.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Nothing?"</span>
</div>
You repeat yourself. Nothing.
Tomaso looks back toward his caravan. Then toward you. Then toward his caravan again, as though somewhere between the two an explanation might reveal itself.
Eventually, he sighs. Deeply.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"A tragedy."</span>
</div>
One hand presses against his chest.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"But even the finest merchant cannot save a man determined to remain poor."</span>
</div>
The grin returns before the insult has even settled. He turns away.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Another time, perhaps!"</span>
</div>
His people begin preparing the caravan to move again. Bundles are secured. The strange animals are turned around.
Tomaso climbs back onto his padded seat and raises one hand in farewell.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Should wisdom find you before I do, remember the name Vellari!"</span>
</div>
Then the caravan slowly disappears the way it came.
Nothing changes hands. For now.
<<elseif _v.outcome is "killed">>
You look past Tomaso. At the cart. The bundles. The strange animals. The people travelling beneath his protection.
Then back to him.
There is a much simpler kind of trade available here.
You raise one hand. Your warriors understand. Spears lower.
Tomaso's smile vanishes. For the first time since arriving, his hands leave his moustache entirely.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Ah."</span>
</div>
His guards react quickly. Credit where it is due.
Four weapons come free almost at once. One man moves in front of Tomaso while another shouts something toward the handlers.
But they are standing in the middle of your camp. Surrounded. Outnumbered. And very far from home.
Tomaso takes one slow step backward.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"My friend..."</span>
</div>
His eyes move from spear to spear.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"I believe there has been a terrible misunderstanding."</span>
</div>
There has not.
You give the order. The camp erupts.
One of Tomaso's guards manages to thrust his spear into the first man who reaches him. Another is dragged down before he can swing.
The others fight. Briefly.
Tomaso does not.
He turns toward the cart. Perhaps he means to climb aboard. Perhaps he simply wants something solid between himself and what is coming.
He never reaches it.
A spear catches him through the side. The impact folds him over.
For a moment he remains standing, staring down at the shaft jutting from his clothes with an expression of genuine disbelief.
Then his knees give way.
The proprietor of the Vellari Trading House collapses into the dirt. The fighting ends soon after. Silence returns slowly.
What remains belongs to you.
The cart is searched. Bundles are opened. Containers are broken into.
Much of what Tomaso carried is incomprehensible in purpose, but plenty requires no explanation at all.
Worked objects. Useful tools. Preserved materials. Foreign luxuries.
Goods your tribe could never have produced for itself.
Four of the people travelling under Tomaso's ownership survive the fighting unharmed. They watch you warily as their restraints are removed.
Whatever lives they had before this caravan are far behind them now. There is little reason for them to leave.
By the time the dead have been stripped and the useful cargo carried into camp, Tomaso Vellari's great eastern expedition has been reduced to scattered blood, an abandoned cart, and possessions divided among strangers.
He came west looking for profit. Instead, everything he brought with him has become yours.
<div class="result-list">
<div class="result-line good"><span class="label">Goods gained</span><span class="value">+14</span></div>
<div class="result-line good"><span class="label">Population gained</span><span class="value">+4</span></div>
<div class="result-line bad"><span class="label">Tomaso Vellari</span><span class="value">Will not return</span></div>
</div>
<<else>>
<<if _v.outcome is "services">>
The ordinary bargaining eventually comes to an end.
Food and raw materials have changed hands. Goods have been carried into your camp.
Yet one part of the agreement remains unsettled.
Tomaso glances toward the members of his caravan set aside for precisely that purpose. Then back to you.
His moustache turns slowly between two fingers.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"Business before pleasure, my friend. Business is finished."</span>
</div>
He claps twice and calls something in rapid Veyran toward the rear of the caravan. A canvas flap folds back and two women step into the light.
The first is smaller than the women of your tribe, fine-boned, dark hair pinned with copper clips, her eyes lined with kohl that gives them a sharp, carved quality.
The second stands a half-head taller, broader through the hips, her skin a shade darker, close-cropped hair exposing gold rings along the curve of one ear.
Both wear layered linen robes dyed in deep reds, carrying the scent of some warm eastern oil between them. They look you over the way a tanner examines a hide, thorough and without shame, then bow in unison.
They lead you through the caravan to a private tent, cushioned with woven mats and thick blankets.
A clay lamp burns on a low table beside a bowl of water and a folded strip of cloth. The smaller one closes the flap while the taller pulls loose the cord at your waist.
Her hands move with the sureness of someone who has performed this task a hundred times. She draws your clothing aside and her composure cracks for the first time, a sharp pull of air through her teeth. She says something low in Veyran, and the smaller one circles to look, her kohl-lined eyes widening.
They kneel together on the blankets before you. The smaller one takes you into her mouth first, her tongue moving in slow, practiced rhythms, one hand braced on your hip.
<<nsfwimg "images/events/tomato/sex1.webm">>
The taller one presses her lips to the side of your shaft, her tongue tracing the thick veins as her companion works, their mouths overlapping, warm and wet against each other and against you.
Small sounds escape them, muffled hums and sharp intakes through the nose, and the taller one's hand grips the base where the smaller one's mouth cannot reach.
The smaller one draws back, lips flushed, and presses her hand flat against your chest, guiding you down onto the blankets. The taller one straddles you, and the wet heat of her settles against your stomach as she positions herself above. She lowers herself slowly, her thighs trembling, a low groan pressed through her teeth as she takes you in.
The smaller one kneels beside you, her fingers finding the taller woman's nipples, pulling and rolling them as the pace builds. The taller woman's movements lose their precision, growing faster, rougher, her nails raking across your chest, until she stiffens with a sharp cry.
The smaller one guides her off and takes her place, sinking down with a shuddering exhale, riding you in tight, grinding circles while the taller woman's fingers work between her own legs beside you.
<<nsfwimg "images/events/tomato/sex2.webm">>
She clenches hard around you and comes apart with a whimper.
Afterward the taller one reaches for the bowl and cleans you with the cloth, her touch brisk. They dress, re-pin their hair, and each touches two fingers to her lips, then extends them toward you. The tent flap opens. Daylight cuts through.
<<else>>
Eventually, there is nothing more to bargain over.
The last bundle changes hands.
Tomaso looks over what he has gained, then over what remains of his own wares. He seems satisfied.
Which probably means you should be suspicious.
<</if>>
Some time later, the caravan is made ready to leave. Bundles are retied. Animals are loaded.
Those travelling with Tomaso gather once more around the cart as his guards take their places along its sides.
Tomaso himself climbs back onto his padded seat. With effort.
Once settled, he adjusts his clothes, looks over your camp, and gives an approving nod.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line"><<if _v.isFirstVisit>>"A pleasure, my friend."<<else>>"A pleasure, as always."<</if>></span>
</div>
His grin widens.
"And remember: should you ever find yourself wanting something impossible to find..."
One finger rises.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Tomaso Vellari</span>
<span class="dialogue-line">"You simply haven't asked the right merchant yet."</span>
</div>
He gives the side of the cart two firm pats. The caravan begins to move. Slowly, naturally.
Tomaso raises a hand in farewell while the strange beasts carry him away from the camp.
Before long, the eastern merchant and his entourage disappear back into the wilderness.
Until the next time fortune, profit, or simple greed brings Tomaso Vellari west again.
<<if _v.outcome is "services">>
<div class="result-list">
<div class="result-line good"><span class="label">Stability</span><span class="value">+5</span></div>
</div>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<button _endLabel>><<endMajorEvent>><</button>></div><<silently>>
<<set _v = setup.tomaso.visit()>>
<<set _q = setup.tomaso.quote()>>
<</silently>>
<div class="hub-textbox">
<b>TOMASO VELLARI'S WARES</b>
<br><br>Tomaso accepts Food and Resources. His special wares are priced for this visit alone.
<div class="result-list"><div class="result-line"><span class="label">Your offered value</span><span class="value"><<print _q.offered>></span></div><div class="result-line"><span class="label">Tomaso's asking value</span><span class="value"><<print _q.requested>></span></div></div>
<b>You offer</b>
<div class="result-list">
<div class="result-line"><span class="label">Food (<<print $food>> available)</span><span class="value"><<button "−">><<run setup.tomaso.change("offerFood",-1)>><<goto "Event_Major_Tomaso_Trade">><</button>> <<print _v.offerFood>> <<button "+">><<run setup.tomaso.change("offerFood",1)>><<goto "Event_Major_Tomaso_Trade">><</button>></span></div>
<div class="result-line"><span class="label">Resources (<<print $resources>> available)</span><span class="value"><<button "−">><<run setup.tomaso.change("offerResources",-1)>><<goto "Event_Major_Tomaso_Trade">><</button>> <<print _v.offerResources>> <<button "+">><<run setup.tomaso.change("offerResources",1)>><<goto "Event_Major_Tomaso_Trade">><</button>></span></div>
</div>
<b>You request</b>
<div class="result-list">
<div class="result-line"><span class="label">Goods — 3 value each (<<print _v.goodsStock>> available)</span><span class="value"><<button "−">><<run setup.tomaso.change("askGoods",-1)>><<goto "Event_Major_Tomaso_Trade">><</button>> <<print _v.askGoods>> <<button "+">><<run setup.tomaso.change("askGoods",1)>><<goto "Event_Major_Tomaso_Trade">><</button>></span></div>
<div class="result-line"><span class="label">People — 60 value each (<<print _v.peopleStock>> available)</span><span class="value"><<button "−">><<run setup.tomaso.change("askPeople",-1)>><<goto "Event_Major_Tomaso_Trade">><</button>> <<print _v.askPeople>> <<button "+">><<run setup.tomaso.change("askPeople",1)>><<goto "Event_Major_Tomaso_Trade">><</button>></span></div>
<div class="result-line"><span class="label">Services — 18 value (<<print _v.servicesStock>> available)</span><span class="value"><<button "−">><<run setup.tomaso.change("askServices",-1)>><<goto "Event_Major_Tomaso_Trade">><</button>> <<print _v.askServices>> <<button "+">><<run setup.tomaso.change("askServices",1)>><<goto "Event_Major_Tomaso_Trade">><</button>></span></div>
</div>
<<if _v.message>><div class="result-list"><div class="result-line"><span class="label">Tomaso</span><span class="value"><<print _v.message>></span></div></div><</if>>
</div>
<div class="hub-buttons"><<button "Propose exchange">><<run setup.tomaso.finalize()>><<goto "Event_Major_Tomaso_Trade">><</button>><<button "Finish trading">><<run setup.tomaso.leaveTrade()>><<goto "Event_Major_Tomaso_Resolve">><</button>></div><<silently>>
<<set _ev = $currentEvent ?? ($eventQueue and $eventQueue.length ? $eventQueue[0].event : null)>>
<<set _name = _ev?.sourceTribeName ?? _ev?.title ?? "Tribe Destroyed!">>
<<set _text = _ev?.text ?? "A tribe has fallen.">>
<</silently>>
''<div class="hub-textbox">
<h2><<print _name>></h2>
<p>
Word reaches you the way it always does out here. Late, warped, carried on someone else’s breath. A runner with split lips. A hunter who speaks too quickly. Tracks that end too suddenly.
</p>
<p>
The details don’t hold. Names smear. Numbers change. The tale reshapes itself depending on who’s trying to sleep afterward.
</p>
<p>
But the end stays the same: a fire has gone out somewhere.
</p>
<p><<print _text>></p>
<p>
Some will blame strangers. Some will blame spirits. Some will whisper a chieftain’s name—yours, or another’s—because people always need a hand to point at.
</p>
<p>
Whether it was done by your enemies, friends, or <i>by</i> you— the land has opened a quiet space, and quiet spaces never stay empty for long.
</p>
</div>''
<div class="hub-buttons">
<<button "The first of many.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* Resolve tribe */
<<set _tribe = null>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _met = false>>
<<if _tribe>>
<<set _met = (!!_tribe.contacted) or (!!($metTribeIds and $metTribeIds[_tribe.id]))>>
<</if>>
/* Trade state */
<<if _entry and !_entry.tradeState>>
<<set _entry.tradeState = {
choice: null,
applied: false,
log: {}
}>>
<</if>>
/* Power option: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!((setup.powerOwned && setup.powerOwned("sway")) || ($powersOwned && $powersOwned.sway))>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<</silently>>
''<div class="hub-textbox">
<<if _met and _tribe>>
<div>
<b><<print _tribe.name>></b>
</div>
Familiar figures emerge from the treeline, their forms stark against the shadows. It is the <<print _tribe.name>>. They move with a wary calm, a silence that speaks of past troubles and a hope for present profit.
<br><br>
They lay out their wares—carved bone, preserved hides, rare herbs—on a spread hide between the camps. Their gazes are sharp, missing nothing, constantly flicking from your face to your hands, to the weapons of your warriors who stand watch. The air is taut, stretched thin. A single harsh word, a gesture too quick, and this barter becomes a bloodletting. This is a test of nerve as much as a trade of value.
<<else>>
Figures drift from the treeline, not with the aggression of raiders, but with the slow, deliberate caution of predators testing a new territory. They are strangers, their faces unfamiliar, their bearing taut with a nervous energy. They carry bundles of strange make, and their eyes, though fixed on you, constantly dart towards the weapons of your warriors.
<br><br>
They seem more interested in the weight of coin than the weight of a spear... for now. The unspoken "for now" hangs in the air between you, a palpable threat.
<br><br>
They lay out their wares—objects of carved wood and woven reed, unfamiliar and alien in the morning light. Their hands move with practiced care, but their eyes never stop their assessment, watching your face for a flicker of emotion, your hands for the slightest hint of betrayal. A single harsh word, a gesture too quick, and this quiet barter could shatter into a test of nerves, where value is measured in blood.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Negotiate carefully (Stewardship)</span>">>
<<set _entry.tradeState.choice = "stew">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<button "<span class='choice-text'>Win them over (Charisma)</span>">>
<<set _entry.tradeState.choice = "cha">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<if _canSway>>
<<button "<span class='choice-text'>Let power bleed into your words, a subtle fire that warms them to your way of thinking. (Sway: <<print _swayCost>> Belief)</span>">>
<<set _entry.tradeState.choice = "sway">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled"
title="<<print _hasSway ? ('Need ' + _swayCost + ' Belief.') : 'You have not acquired Sway.'>>">
<span class="choice-text">Let power bleed into your words, a subtle fire that warms them to your way of thinking. (Sway: <<print _swayCost>> Belief)</span>
</span>
<</if>>
<<button "<span class='choice-text'>A simple exchange (no check)</span>">>
<<set _entry.tradeState.choice = "base">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _st = _entry ? _entry.tradeState : null>>
<<set _choice = _st ? (_st.choice ?? "base") : "base">>
/* Resolve tribe again */
<<set _tribe = null>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Power: Sway (for resolve) */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!((setup.powerOwned && setup.powerOwned("sway")) || ($powersOwned && $powersOwned.sway))>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
/* Tunables */
<<set _dc = 15>>
<<set _roll = random(1, 20)>>
<<if _choice is "stew">>
<<set _dc = 14>>
<<elseif _choice is "cha">>
<<set _dc = 12>>
<</if>>
/* Baseline rewards */
<<set _foodBase = 46>>
<<set _goodsBase = 3>>
/* One-time apply */
<<if _entry and _st and !_st.applied>>
<<set _st.applied = true>>
<<set _ok = true>>
<<set _statKey = null>>
<<set _statVal = 0>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
/* Defaults per your table */
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<<set _popGain = 0>>
<<set _tribePopLoss = 0>>
<<if _choice is "stew">>
<<set _statKey = "Stewardship">>
<<set _statVal = setup.player.getStatForCheck("stewardship")>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _foodGain = 76>>
<<set _goodsGain = 5>>
<<set _relDelta = 2>>
<<set _moodDelta = 2>>
<<set _tribeResGain = 12>>
<<else>>
/* Reduced (but still positive) outcome */
<<set _foodGain = 27>>
<<set _goodsGain = 1>>
/* keep defaults: rel +1, tribeRes +21 */
<</if>>
<<elseif _choice is "cha">>
<<set _statKey = "Charisma">>
<<set _statVal = setup.player.getStatForCheck("charisma")>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _foodGain = 62>>
<<set _goodsGain = 3>>
<<set _popGain = 1>>
<<set _tribePopLoss = 1>>
<<set _relDelta = 5>>
/* keep defaults: mood 0, tribeRes +21 */
<<else>>
<<set _foodGain = 30>>
<<set _goodsGain = 3>>
<<set _relDelta = -1>>
/* keep defaults: mood 0, tribeRes +21 */
<</if>>
<<elseif _choice is "sway">>
/* Safety: if something calls resolve without paying, don't apply Sway benefits */
<<if _canSway>>
<<set $belief = Math.max(0, Number($belief ?? 0) - _swayCost)>>
<<set _ok = true>>
<<set _statKey = "Sway">>
<<set _foodGain = 95>>
<<set _goodsGain = 6>>
<<set _relDelta = 8>>
<<set _moodDelta = 1>>
<<set _tribeResGain = -10>>
<<else>>
/* Fallback to base trade if Sway isn't actually available */
<<set _choice = "base">>
<<set _ok = true>>
<<set _statKey = null>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<</if>>
<<else>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
<<set _ok = true>>
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<</if>>
/* Apply player deltas (clamped to avoid negatives) */
<<set $food = Math.max(0, Number($food ?? 0) + _foodGain)>>
<<set $goods = Math.max(0, Number($goods ?? 0) + _goodsGain)>>
<<if _popGain > 0>>
<<set $pops = Number($pops ?? 0) + _popGain>>
<</if>>
<<if _tribe>>
<<set _relDelta = (setup.tribes && setup.tribes.getRelationDelta) ? setup.tribes.getRelationDelta(_tribe, _relDelta) : _relDelta>>
<<set _tribe.relations = Number(_tribe.relations ?? 0) + _relDelta>>
<<set _tribe.mood = Number(_tribe.mood ?? 0) + _moodDelta>>
<<if _tribe.stats and _tribeResGain != 0>>
<<set _tribe.stats.resources = Math.max(0, Number(_tribe.stats.resources ?? 0) + _tribeResGain)>>
<</if>>
<<if _tribe.stats and _tribePopLoss > 0>>
<<set _tribe.stats.population = Math.max(0, Number(_tribe.stats.population ?? 0) - _tribePopLoss)>>
<</if>>
<</if>>
<<set _st.log = {
choice:_choice,
dc:_dc,
roll:_roll,
statKey:_statKey,
statVal:_statVal,
ok:_ok,
foodGain:_foodGain,
goodsGain:_goodsGain,
popGain:_popGain,
tribePopLoss:_tribePopLoss,
relDelta:_relDelta,
moodDelta:_moodDelta,
tribeResGain:_tribeResGain,
swayCost:(_choice is "sway" ? _swayCost : 0)
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _tribe and _tribe.name>>
<div>
<b><<print _tribe.name>></b>
</div><br>
<</if>>
<!-- Show check results OR Sway invoke line -->
<<if _st and _st.log and _st.log.statKey>>
<<if _st.log.statKey is "Sway">>
<div class="result-list">
<div class="result-line good">
<span class="label">Power</span>
<span class="value">SWAY</span>
</div>
<div class="result-line">
<span class="label">Belief spent</span>
<span class="value">-<<print _st.log.swayCost>></span>
</div>
</div>
<br><br>
<<else>>
<<set _total = _st.log.statVal + _st.log.roll>>
<div class="result-list">
<<if _st.log.ok>>
<div class="result-line good">
<span class="label"><<print _st.log.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print _st.log.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _st.log.roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _st.log.statKey>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _st.log.dc>></span>
</div>
</div>
<br><br>
<</if>>
<</if>>
<<if _st and _st.log>>
<<if _st.log.choice is "stew">>
<<if _st.log.ok>>
Patience is a language you speak fluently. You stand rooted, letting the silence hang in the air, a testament to your control. You watch as they lay out their goods, your eyes missing nothing, cataloging each item not with greed, but with the dispassionate precision of a master craftsman examining raw materials.
<br><br>
When the last hide is unfurled, you move forward. There is no wasted motion.
Your gaze performs a silent, lightning-fast inventory, a count so subtle it is barely a flicker of your eyelids. You do not grope or fumble.
Your hands move with purpose, touching only what must be touched: testing the weave of a basket, feeling the heft of a stone axe head, checking the cure on a strip of leather. Each touch is a quiet interrogation, and the goods give up their secrets to your experienced fingers.
<br><br>
Your voice, when it comes, is neither loud nor aggressive. It is a calm river of fact. A quiet word about a weakened seam. A small gesture to a hairline fracture in a pot. Your counters are not haggling; they are simple, undeniable truths that adjust the value of their wares.
<br><br>
The lead trader, a woman whose eyes have seen a dozen seasons of hard bargaining, watches you. Her initial wariness melts away, replaced by a grudging respect. She sees she is facing not a chieftain to be bluffed, but a true steward of value. She holds your gaze for a long, measured moment, then gives a single, slow nod of acceptance.
<br><br>
The deal settles into place not with a handshake, but with a shared understanding. It feels like a heavy stone sinking into deep mud, its final position absolute, its weight impossible to dispute. The bargain is struck, and it is ironclad.
<<else>>
You try to keep it clean—numbers, measures, fairness. Your mind is a ledger, and you intend to balance it perfectly.
<br><br>
Your eye catches on a particular item: a bundle of herbs, vibrant and green, or a hide with a pattern that seems to shimmer in the light. It seems a prize beyond measure, a rare find that could elevate your tribe's status. You anchor the entire trade around this one jewel, conceding value elsewhere to secure it, feeling a surge of triumph as the deal is struck.
<br><br>
Only as they are packing up, as you run a thumb over the surface again in the quiet aftermath, do you notice it. The faint scent of dust, not potency, from the herbs. The brittle feel to the hide that speaks of a poor cure, not a rare one. The initial excitement had blinded you, and you saw only what you wanted to see.
<br><br>
The deal is already done. The words spoken. You look up, but the traders are already shouldering their remaining goods. You catch the lead trader's eye. There is no smirk of deception, only a flat, knowing look. The look one gives a child who has just learned a hard lesson about the world. They didn't trick you; you tricked yourself.
<br><br>
You are left with your prize, its true, lesser value now glaringly obvious. The shame of your own miscalculation burns sharper than any flame.
<</if>>
<<elseif _st.log.choice is "cha">>
<<if _st.log.ok>>
You don't trade only in goods, but in something far more valuable: goodwill. Your voice is a calm current cutting through the tense silence, each word chosen not for its meaning, but for its tone. It is the sound of a stream, not a waterfall.
<br><br>
You offer a shared laugh at a mishap—a dropped bundle of furs—that is not a baring of teeth, but a moment of simple, clumsy humanity. You tell a brief, self-deprecating story of a hunt gone awry, a tale that makes you not a chieftain to be feared, but a person to be understood. It is a bridge built of nothing but words, and you see them cross it, one by one.
<br><br>
The suspicion in their eyes doesn't vanish, but it ebbs. Shoulders, once tight with readiness for a fight, slump slightly. Hands that rested on knife hilts now hang loose at their sides. The space between the two groups feels less like a battleground and more like a shared patch of neutral ground.
<br><br>
One of them, a younger individual with eyes that hold more weariness than malice, lingers at the edge of the group. Their gaze keeps flicking past you, drawn to the heart of your camp. To the crackling fire, a beacon of warmth against the encroaching dusk. To the familiar sounds of your people, a promise of community, of safety.
<br><br>
When the trade is concluded and the others begin to gather their things, there is a pause. The main group turns to leave, but one does not. One takes a hesitant step closer to the fire, their choice made in the heavy silence. One stays.
<<else>>
You try to make them like you.
<br><br>
It comes out wrong—your smile too eager, your gestures too sharp, your confidence a bludgeon. You point to a fine hide, intending praise, but the motion is dismissive, a backhanded compliment that speaks louder than any words.
<br><br>
They smile, but it's the kind of smile that counts weaknesses. You see them exchange a look—a flicker of an eyelash, a subtle tilt of the head—that speaks volumes. They have found your weakness: you are trying too hard.
<br><br>
Their lead trader meets your offers with a polite nod, their expression a wall of civility. They never raise their voice, but the air between you grows thick and cold, turning to ice. The negotiation is over before it began. They accept your terms with a swift, final movement, not because the deal is fair, but because the cost of your company is higher than any price.
<br><br>
The trade finishes fast.
<br><br>
They gather their things like men who plan not to be here long.
<</if>>
<<elseif _st.log.choice is "sway">>
You let the moment hang, allowing the silence to settle.
<br><br>
Then, you reach for the quiet certainty in your own chest and let it bleed into the air around you. It isn't a command, but a suggestion—a feeling of ease that settles over them like a warm sun on a cold day. You aren't forcing their thoughts, only gently nudging their emotions, making the path of trust feel like the most natural one to walk.
<br><br>
The lead trader, who was about to make a hard counter-offer, finds the words catching in their throat. The sharp edge of their suspicion blunts, not vanishing, but losing its point. The tension in their shoulders uncoils with a slow, almost imperceptible release. The negotiation flows from that point on, not because they are compelled, but because the very idea of conflict feels distant and unnecessary.
<br><br>
They leave with a faint sense of puzzlement, like they've forgotten a worry they knew they had just moments ago, unable to recall exactly what it was that seemed so important.
<<else>>
There is no dance of words, no performance of friendship. Today is not a day for pride, but for simple necessity.
<br><br>
You point to a bundle of hides; they gesture to a pile of herbs. A nod confirms the exchange. It is barter in its rawest form: hands, goods, and the hard, quiet understanding that any sudden move will be the last one.
<br><br>
You keep your eyes on theirs, and they do the same, a mutual, unblinking caution that is the only trust either side is willing to offer.
<</if>>
<<else>>
You complete the trade.
<</if>>
<br><br>
<b>You gain</b>
<div class="result-list">
<div class="result-line good">
<span class="label">Food</span>
<span class="value"><<print (_st.log.foodGain >= 0 ? "+" : "") + _st.log.foodGain>></span>
</div>
<div class="result-line good">
<span class="label">Goods</span>
<span class="value"><<print (_st.log.goodsGain >= 0 ? "+" : "") + _st.log.goodsGain>></span>
</div>
<<if _st.log.popGain > 0>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+<<print _st.log.popGain>></span>
</div>
<</if>>
</div>
<<if _tribe>>
<br><br>
<b>Effects on the other tribe</b>
<div class="result-list">
<div class="result-line">
<span class="label">Relations</span>
<span class="value"><<print (_st.log.relDelta >= 0 ? "+" : "") + _st.log.relDelta>></span>
</div>
<<if _st.log.moodDelta != 0>>
<div class="result-line">
<span class="label">Mood</span>
<span class="value"><<print (_st.log.moodDelta >= 0 ? "+" : "") + _st.log.moodDelta>></span>
</div>
<</if>>
<<if _tribe.stats and _st.log.tribeResGain != 0>>
<div class="result-line">
<span class="label">They gain resources</span>
<span class="value"><<print (_st.log.tribeResGain >= 0 ? "+" : "") + _st.log.tribeResGain>></span>
</div>
<</if>>
<<if _st.log.tribePopLoss > 0>>
<div class="result-line bad">
<span class="label">They lose population</span>
<span class="value">-<<print _st.log.tribePopLoss>></span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Close the bargain.</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<if _entry and !_entry.tributeState>><<set _entry.tributeState = {}>><</if>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown") : "Unknown")>>
<<set _met = (_tribe and !!_tribe.contacted) or ($metTribeIds and $metTribeIds[_tid])>>
<<set _pridefulActive = !!(setup.flaws and setup.flaws.has and setup.flaws.has("prideful"))>>
<<set _pridefulTributeCost = 25>>
<<set _canGiveIn = !_pridefulActive or Number($belief ?? 0) >= _pridefulTributeCost>>
<</silently>>
''<div class="hub-textbox">
<<if _met>>
<div><b><<print _tribeName>></b></div>
An envoy from the <<print _tribeName>> steps into the open with two of their tribes warriors behind them. Looking at his posture its clear they didn't come here to trade.
<br><br>
Instead...They announce terms. Food. Stores. Goods. A sign of goodwill they call it. The threat itself remains implied. What will you do?
<<else>>
A stranger comes under watch, flanked by hard-faced escorts who stop just outside spear range.
<br><br>
The envoy raises empty hands, then names a price without bowing. They want food, stores, and crafted goods in exchange for not coming back...In bigger numbers..
<br><br>
It is not a bargain. You dont hold any leverage, or at the very least, the envoy before you doesnt seem to think you do....The question remains though...What do you do?
<</if>>
</div>''
<div class="hub-buttons">
<<if _canGiveIn>>
<<button "<span class='choice-text'>Give in</span>">>
<<set _entry.tributeState.choice = "give_in">>
<<goto "Event_Major_TribeTribute_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Prideful requires 25 Belief to swallow submission. You have <<print Number($belief ?? 0)>>."><span class='choice-text'>Give in</span></span>
<</if>>
<<button "<span class='choice-text'>Refuse</span>">>
<<set _entry.tributeState.choice = "refuse">>
<<goto "Event_Major_TribeTribute_Resolve">>
<</button>>
<<button "<span class='choice-text'>Kill Messenger</span>">>
<<set _entry.tributeState.choice = "kill_messenger">>
<<goto "Event_Major_TribeTribute_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _st = _entry ? _entry.tributeState : null>>
<<set _choice = _st ? (_st.choice ?? "refuse") : "refuse">>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown") : "Unknown")>>
<<if _entry and _st and !_st.applied and _tid>>
<<set _st.applied = true>>
<<set _st.result = setup.tribes.applyTributeOutcome(_tid, _choice)>>
<</if>>
<<set _res = _st ? _st.result : null>>
<</silently>>
''<div class="hub-textbox">
<<if _tribeName>><div><b><<print _tribeName>></b></div><br><</if>>
<<if _res>>
<div class="result-list">
<div class="result-line">
<span class="label">Choice</span>
<span class="value">
<<if _res.choice is "give_in">>Give in<<elseif _res.choice is "kill_messenger">>Kill Messenger<<else>>Refuse<</if>>
</span>
</div>
<<if _res.foodLoss > 0>>
<div class="result-line bad"><span class="label">Food</span><span class="value">-<<print _res.foodLoss>></span></div>
<</if>>
<<if _res.resourcesLoss > 0>>
<div class="result-line bad"><span class="label">Resources</span><span class="value">-<<print _res.resourcesLoss>></span></div>
<</if>>
<<if _res.goodsLoss > 0>>
<div class="result-line bad"><span class="label">Goods</span><span class="value">-<<print _res.goodsLoss>></span></div>
<</if>>
<<if Number(_res.pridefulBeliefCost ?? 0) > 0>>
<div class="result-line bad"><span class="label">Prideful</span><span class="value">-<<print _res.pridefulBeliefCost>> Belief</span></div>
<</if>>
<<if _res.tribePopLoss > 0>>
<div class="result-line good"><span class="label">Enemy Population</span><span class="value">-<<print _res.tribePopLoss>></span></div>
<</if>>
<<if _res.zealDelta > 0>>
<div class="result-line good"><span class="label">Zeal</span><span class="value">+<<print _res.zealDelta>></span></div>
<</if>>
<<if _res.relationsDelta > 0>>
<div class="result-line good"><span class="label">Relations</span><span class="value">+<<print _res.relationsDelta>></span></div>
<<elseif _res.relationsDelta < 0>>
<div class="result-line bad"><span class="label">Relations</span><span class="value"><<print _res.relationsDelta>></span></div>
<</if>>
<<if _res.raidBlockedTurns > 0>>
<div class="result-line good"><span class="label">Raid Relief</span><span class="value"><<print _res.raidBlockedTurns>> turns</span></div>
<<elseif _res.raidPressure > 0>>
<div class="result-line bad"><span class="label">Raid Pressure</span><span class="value">+<<print _res.raidPressure>></span></div>
<</if>>
</div>
<br><br>
<</if>>
<<if _choice is "give_in">>
You look at the envoy as your eyes narrow. Then you raise your fist. The envoy seems to flinch at that. A nice little comfort at least...Before you open your fist. Your people understand the meainging imiddietly.
Bundles are brought out under watch: sacks of food, hard-kept stores, goods that took hands and time to shape.
<br><br>
The envoy checks each portion with insulting care, then nods once. Then a cold assurance that their raiders will hold back for a while so long as memory of this payment stays fresh.
<br><br>
When they are gone, the camp is quieter than before. No blood was spilled, but nobody feels like celebrating.
<<elseif _choice is "kill_messenger">>
Before the envoy can finish-
<br><br>
The envoy lies dead, by your hands. While the ones accompanying him are wise enough to escape before the same fate befalls them
<br><br>
There isnt silence here. Instead only growing chants from your people
Whether this small victory and your peoples support will be worth the retribtuion surely headed your way...Only time will tell.
<<else>>
You refuse them plainly and send the envoy away empty-handed.
<br><br>
The messenger's face changes, perhaps he wants to argue with you...Yet one look at your $eyes eyes quickly makes him understand the fate that would befall him were he to attempt to.
<br><br>
No tribute leaves the camp today, but tension remains in the air as the envoy leaves. You have a feeling they will try to take their tribute, with or without your consent.
<</if>>
</div>''
<div class="hub-buttons">
<<button "Send your answer back with them.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_UnbiddenSpoils") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev ? (_ev.data ?? {}) : {}>>
<<set _tribeName = _data.targetTribeName ?? (_ev ? (_ev.sourceTribeName ?? "Unknown Tribe") : "Unknown Tribe")>>
<<if _entry and !_entry.traditionSpoilsState>><<set _entry.traditionSpoilsState = { choice: null, applied: false, result: null }>><</if>>
<</silently>>
''<div class="hub-textbox">
<div><b>Unbidden Spoils</b></div><br>
A band of your hunters returns to camp earlier than expected, laughing loudly and carrying more than game.
Some wear new beads around their necks. Others drag sacks of food, tools, and worked goods behind them. When questioned, their pride only grows. They claim they found weakness among <b><<print _tribeName>></b>, struck quickly, and returned before the other tribe could prepare a proper response.
Around the camp, the reaction is mixed. Some stare at the spoils with hunger. Others glance toward you, waiting to see whether such initiative will be rewarded or punished.
</div>''
<div class="hub-buttons">
<<button "Praise their boldness and accept the spoils">>
<<set _entry.traditionSpoilsState.choice = "accept">>
<<goto "Event_Major_UnbiddenSpoils_Resolve">>
<</button>>
<<button "Send the spoils back">>
<<set _entry.traditionSpoilsState.choice = "return">>
<<goto "Event_Major_UnbiddenSpoils_Resolve">>
<</button>>
<<button "Send the ringleader's head as apology">>
<<set _entry.traditionSpoilsState.choice = "execute">>
<<goto "Event_Major_UnbiddenSpoils_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_UnbiddenSpoils") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _state = _entry ? _entry.traditionSpoilsState : null>>
<<set _choice = _state ? (_state.choice ?? "return") : "return">>
<<if _entry and _state and !_state.applied>>
<<set _state.applied = true>>
<<set _state.result = setup.traditionEvents.applyUnbiddenSpoilsOutcome(_entry, _choice)>>
<<if _choice is "execute">><<run setup.aspects.addPoints("blood", 2, "Sent the ringleader's head")>><</if>>
<</if>>
<<set _result = _state ? _state.result : null>>
<<set _tribeName = _result ? _result.targetName : "Unknown Tribe">>
<<if _choice is "accept">>
<<set _endLabel = "Count the spoils.">>
<<elseif _choice is "execute">>
<<set _endLabel = "Let the lesson spread.">>
<<else>>
<<set _endLabel = "Send the goods back.">>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div><b>Unbidden Spoils</b></div><br>
<<if _choice is "accept">>
You are silent for a moment.
Then you nod approvingly.
The hunters boast louder, the spoils are divided, and you, as chieftain, are handed your rightful share. Around the camp, the raid is taken as proof that strength should be used when opportunity appears.
<<elseif _choice is "execute">>
To some, it comes as a shock. To others, it seems like the natural end of such foolhardiness. Raiding weaklings is one thing. Doing it without your approval however, is another.
The ringleader dies by your hand before he fully understands what is happening. The stolen goods are returned, along with his head, leaving <<print _tribeName>> hard-pressed to question the sincerity of your apology.
Outside the camp, the matter is settled. Inside it, the lesson is colder. Raiders now know that acting without your will can cost more than failure.
Whether that will be enough to stop others from testing their luck in the future, only time will tell.
<<else>>
You think on it for a bit, then make your decision.
You order the goods returned before matters escalate further, but the decision leaves a bitter taste in camp, especially among the would-be raiders. To many, you have traded earned spoils for the approval of those too weak to defend them.
<</if>>
<<if _result>>
<div class="result-list">
<<if _choice is "accept">>
<div class="result-line good"><span class="label">Gained</span><span class="value"><<print _result.foodGain>> Food</span></div>
<div class="result-line good"><span class="label">Gained</span><span class="value"><<print _result.resourcesGain>> Resources</span></div>
<div class="result-line good"><span class="label">Gained</span><span class="value"><<print _result.goodsGain>> Goods</span></div>
<div class="result-line bad"><span class="label"><<print _tribeName>> loses</span><span class="value"><<print _result.targetResourceLoss>> Resources</span></div>
<div class="result-line bad"><span class="label">Relations with <<print _tribeName>></span><span class="value">-<<print _result.relationLoss>></span></div>
<div class="result-line good"><span class="label">Stability</span><span class="value">+5</span></div>
<<elseif _choice is "execute">>
<div class="result-line bad"><span class="label">Lose</span><span class="value">1 Population</span></div>
<div class="result-line good"><span class="label">Blood</span><span class="value">+2</span></div>
<div class="result-line bad"><span class="label">Stability</span><span class="value"><<print _result.stabilityDelta>></span></div>
<div class="result-line bad"><span class="label">Zeal</span><span class="value"><<print _result.zealDelta>></span></div>
<div class="result-line"><span class="label">Relations with <<print _tribeName>></span><span class="value">No loss</span></div>
<<else>>
<div class="result-line"><span class="label">Gained</span><span class="value">Nothing</span></div>
<div class="result-line"><span class="label"><<print _tribeName>> loses</span><span class="value">Nothing</span></div>
<div class="result-line bad"><span class="label">Relations with <<print _tribeName>></span><span class="value">-<<print _result.relationLoss>></span></div>
<div class="result-line bad"><span class="label">Stability</span><span class="value"><<print _result.stabilityDelta>></span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button _endLabel>><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
For a long while now, your people have endured without fracturing.
Disputes are spoken aloud, not whispered. Old grievances are carried openly, not sharpened in the dark. When decisions are made, they are followed—not because all agree, but because all still believe in the whole.
There is a sense among the camp that the story has found its spine.
Children repeat the same tales around different fires and somehow tell them the same way. Elders argue, but they do not undermine. Even faith—restless as it is—moves in the same direction.
Unity is not forced.
It simply holds. And you are its pillar
</div>''
<div class="hub-buttons">
<<button "Let the story hold.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_UnfamiliarFaces") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<if _entry and !_entry.unfamiliarFacesState>><<set _entry.unfamiliarFacesState = { choice: null, applied: false, result: null }>><</if>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = null>>
<<if _tid>>
<<set _tribe = setup.tribes.markContactedByPlayer(_tid, { source: "unfamiliar_faces" })>>
<</if>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown Tribe") : "Unknown Tribe")>>
<</silently>>
''<div class="hub-textbox">
<div><b>Unfamiliar Faces</b></div><br>
<p>
It begins like any other day in camp, with smoke rising from the hearths and hunters returning from the wilds. Then the rhythm breaks.
</p>
<p>
Your hunters drag an unfamiliar face before you. The stranger struggles, but it is useless. Their wrists are locked in hard hands, their feet scrape dirt, and their voice rises in sharp, panicked bursts that mean nothing to your people.
</p>
<p>
To your ears, the words are perfectly clear.
</p>
<p>
They are a scout from a foreign tribe. You crouch in front of them and start asking questions. Fear loosens their tongue quickly enough. Their name, their camp, the paths they followed. Most importantly, the name of their people: <b><<print _tribeName>></b>.
</p>
<p>
It seems they were searching the nearby wilds for other tribes in their vicinity. With your curiosity satisfied, you rise again. The scout stares up at you, breathing hard.
</p>
<p>
The question remains. What will be done with them?
</p>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let them go</span>">>
<<set _entry.unfamiliarFacesState.choice = "release">>
<<goto "Event_Major_UnfamiliarFaces_Resolve">>
<</button>>
<<button "<span class='choice-text'>Imprison them</span>">>
<<set _entry.unfamiliarFacesState.choice = "imprison">>
<<goto "Event_Major_UnfamiliarFaces_Resolve">>
<</button>>
<<button "<span class='choice-text'>Kill them</span>">>
<<set _entry.unfamiliarFacesState.choice = "kill">>
<<goto "Event_Major_UnfamiliarFaces_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && e.event && e.event.passage === "Event_Major_UnfamiliarFaces") ?? $eventQueue[0]>><<set $currentEvent = _entry>><</if>>
<<set _ev = _entry ? _entry.event : null>>
<<if _entry and !_entry.unfamiliarFacesState>><<set _entry.unfamiliarFacesState = { choice: "release", applied: false, result: null }>><</if>>
<<set _st = _entry ? _entry.unfamiliarFacesState : null>>
<<set _choice = _st ? (_st.choice ?? "release") : "release">>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<set _tribe = null>>
<<if _tid>>
<<set _tribe = setup.tribes.markContactedByPlayer(_tid, { source: "unfamiliar_faces" })>>
<</if>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : (_ev ? (_ev.sourceTribeName ?? "Unknown Tribe") : "Unknown Tribe")>>
<<if _entry and _st and !_st.applied and _tid>>
<<set _st.applied = true>>
<<set _st.result = setup.tribes.applyUnfamiliarFacesOutcome(_tid, _choice)>>
<</if>>
<<set _res = _st ? _st.result : null>>
<<if _choice is "kill">>
<<set _endLabel = "Leave the body behind.">>
<<elseif _choice is "imprison">>
<<set _endLabel = "Take them back to camp.">>
<<else>>
<<set _endLabel = "Let them carry the memory home.">>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _choice is "imprison">>
<p>
You look at the scout for a moment, then two, before giving a small, dismissive nod to your men. They understand instantly.
</p>
<p>
Instead of letting the scout go, their hold grows firmer. A third man leaves and returns with strong rope, and together they carry the captive deeper into camp.
</p>
<p>
You doubt their tribe will appreciate such actions, but that is not your concern. You have plans for this one, and those plans take precedence.
</p>
<<elseif _choice is "kill">>
<p>
You look at the scout closely, then crouch back down to meet their eyes. You hold their gaze for a long moment.
</p>
<p>
Then both of your hands move slowly to their face.
</p>
<p><b>CRACK</b></p>
<p>
Their neck breaks. Their body goes limp in the grip of your men. You rise and head back toward camp without a word, leaving your hunters to let the corpse fall to the ground and follow after you in silence.
</p>
<<else>>
<p>
You give a small sign to your men. They understand quickly and let the scout go.
</p>
<p>
The stranger falls to the ground, then rises slowly, eyes fixed on you. After a breath, they give you a small, respectful nod before leaving your camp.
</p>
<p>
You have a feeling your action will leave a good impression.
</p>
<</if>>
<<if _res>>
<br>
<div class="result-list">
<<if _res.relationsDelta > 0>>
<div class="result-line good"><span class="label">Relations with <<print _tribeName>></span><span class="value">+<<print _res.relationsDelta>></span></div>
<<elseif _res.relationsDelta < 0>>
<div class="result-line bad"><span class="label">Relations with <<print _tribeName>></span><span class="value"><<print _res.relationsDelta>></span></div>
<</if>>
<<if _res.hearthDelta > 0>>
<div class="result-line good"><span class="label">Life Signs</span><span class="value">+<<print _res.hearthDelta>></span></div>
<<elseif _res.hearthDelta < 0>>
<div class="result-line bad"><span class="label">Life Signs</span><span class="value"><<print _res.hearthDelta>></span></div>
<</if>>
<<if _res.bloodDelta > 0>>
<div class="result-line good"><span class="label">Blood Signs</span><span class="value">+<<print _res.bloodDelta>></span></div>
<<elseif _res.bloodDelta < 0>>
<div class="result-line bad"><span class="label">Blood Signs</span><span class="value"><<print _res.bloodDelta>></span></div>
<</if>>
<<if _res.tribePopLoss > 0>>
<div class="result-line bad"><span class="label">Their Population</span><span class="value">-<<print _res.tribePopLoss>></span></div>
<</if>>
<<if _res.prisonerName>>
<div class="result-line good"><span class="label">Prisoner</span><span class="value"><<print _res.prisonerName>></span></div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button _endLabel>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.stopAllAudio ? setup.stopAllAudio() : null>>
<</silently>>
''<div class="hub-textbox">
Sleep should come easily. You have been hard at work for days, after all, and your body is finally beginning to feel the attrition of it.
You lie beneath your furs, eyes closed, waiting for sleep to take you into another empty, dreamless night.
Instead, you find only heat. Rising. Constantly Rising.
It gathers slowly at first, trapped beneath the furs and clinging to your skin. Then it grows heavier. Closer. Sweat beads across your body as the air thickens in your chest, as if the night itself has leaned over you and begun to breathe.
You toss and turn, then throw the furs off in an attempt to cool yourself.
The heat does not pass.
At last, unable to bear it any longer, you open your eyes.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sit up</span>">><<goto "Event_Major_UnfinishedPilgrimage_2">><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimage.resolveYardEntrance()>>
<</silently>>
''<div class="unfinished-pilgrimage-cinema unfinished-pilgrimage-cinema--yard no-click-sfx">
<div class="up-cinema-bg up-cinema-bg--street"></div>
<div class="up-cinema-vignette"></div>
<div class="up10-arena-stage" aria-hidden="true">
<div class="up10-figure">
<div class="up10-figure-sprite up10-figure-back"></div>
<div class="up10-figure-sprite up10-figure-idle"></div>
</div>
</div>
<div class="up10-combat-dock-spacer" aria-hidden="true"></div>
<div class="up10-slash-cue" aria-hidden="true"></div>
<div class="up10-strike-blackout" aria-hidden="true"></div>
<div class="up-cinema-lines" aria-live="polite">
<p class="up-cinema-line" style="--i: 0">As you enter the yard, it seems empty.</p>
<p class="up-cinema-line" style="--i: 1">Only for a moment.</p>
<p class="up-cinema-line" style="--i: 2">You notice a figure standing near the center of it.</p>
<p class="up-cinema-line" style="--i: 3">Human in shape.</p>
<p class="up-cinema-line" style="--i: 4">Its back is turned to you, a dark cloak hanging from its shoulders, still as the ruined walls around it.</p>
<p class="up-cinema-line" style="--i: 5">In one aged hand, it holds a spear.</p>
<p class="up-cinema-line" style="--i: 6">You approach.</p>
<p class="up-cinema-line" style="--i: 7">You are not quite sure why.</p>
<p class="up-cinema-line" style="--i: 8">It does not react.</p>
<p class="up-cinema-line" style="--i: 9">Not when your foot touches the broken ground.</p>
<p class="up-cinema-line" style="--i: 10">Not when you draw closer.</p>
<p class="up-cinema-line" style="--i: 11">Not when you reach out your hand.</p>
<p class="up-cinema-line" style="--i: 12">Then its fingers tighten around the spear.</p>
<p class="up-cinema-line" style="--i: 13">You throw yourself aside in the last moment.</p>
<p class="up-cinema-line" style="--i: 14">The blade cuts through the space where your chest had been a heartbeat before.</p>
<p class="up-cinema-line" style="--i: 15">For the first time, the figure turns.</p>
<p class="up-cinema-line" style="--i: 16">The cloak shifts.</p>
<p class="up-cinema-line" style="--i: 17">The hood faces you.</p>
<p class="up-cinema-line" style="--i: 18">And as you search the darkness beneath it, trying to see the face of the thing that almost impaled you...</p>
<p class="up-cinema-line" style="--i: 19">...you realize there is nothing there.</p>
<p class="up-cinema-line" style="--i: 20">The spear rises again.</p>
</div>
<div class="up-cinema-actions">
<<button "<strong class='choice-text'>Defend yourself!</strong>">>
<<run setup.clashV1.startUnfinishedPilgrimage ? setup.clashV1.startUnfinishedPilgrimage() : setup.clashV1.startDebug()>>
<<run setup.clashV1.playHiddenMemoriesClashMusic ? setup.clashV1.playHiddenMemoriesClashMusic({ durationMs: 900 }) : null>>
<<run (setup.eventEngine && setup.eventEngine.finishCurrentMajor) ? setup.eventEngine.finishCurrentMajor("Clash_V1_Battle") : Engine.play("Clash_V1_Battle")>>
<</button>>
</div>
</div>''<<silently>>
<<run setup.clashV1.stopBattleMusic()>>
<<run setup.unfinishedPilgrimageAudio.play("ruins", { targetRatio: 0.5, startRatio: 0.08, fadeMs: 2600 })>>
<</silently>>
''<div class="unfinished-pilgrimage-cinema unfinished-pilgrimage-cinema--victory no-click-sfx">
<div class="up-cinema-bg up11-bg--street"></div>
<div class="up-cinema-bg up11-bg--sky"></div>
<div class="up-cinema-vignette"></div>
<div class="up11-arena-stage" aria-hidden="true">
<div class="up11-figure">
<div class="up11-figure-sprite up11-figure-defeated"></div>
<div class="up11-figure-sprite up11-figure-idle"></div>
</div>
<div class="up11-getup-figure"></div>
</div>
<div class="up11-combat-dock-spacer" aria-hidden="true"></div>
<div class="up11-hit-stumble" aria-hidden="true"></div>
<div class="up11-hit-sfx-cue" aria-hidden="true"></div>
<div class="up11-sky-blackout" aria-hidden="true"></div>
<div class="up11-reality-glitch" aria-hidden="true">
<div class="up11-reality-bg"></div>
<div class="up11-reality-getup"></div>
</div>
<<script>>
setTimeout(function () {
var root = document.querySelector('#passages > .passage[data-passage="Event_Major_UnfinishedPilgrimage_11"]');
var cue = root && root.querySelector(".up11-hit-sfx-cue");
if (!cue || cue.dataset.up11HitBound === "true") {
return;
}
cue.dataset.up11HitBound = "true";
cue.addEventListener("animationstart", function (ev) {
if (ev.animationName !== "up11HitSfxCue" || cue.dataset.up11HitPlayed === "true") {
return;
}
cue.dataset.up11HitPlayed = "true";
try {
var gameSetup = (window.SugarCube && SugarCube.setup) || window.setup;
if (gameSetup && gameSetup.clashV1 && typeof gameSetup.clashV1.playAudioCue === "function") {
gameSetup.clashV1.playAudioCue({ src: "sounds/battle/fist_hit.mp3", gain: 0.95 });
} else {
var audio = new Audio("sounds/battle/fist_hit.mp3");
audio.volume = 0.75;
audio.play().catch(function () {});
}
} catch (e) {}
});
}, 0);
<</script>>
<div class="up-cinema-lines" aria-live="polite">
<p class="up-cinema-line" style="--i: 0">The figure falls to one knee. Defeated.</p>
<p class="up-cinema-line" style="--i: 1">For a moment, it kneels...</p>
<p class="up-cinema-line" style="--i: 2">...Then, with impossible ease, it rises again.</p>
<p class="up-cinema-line" style="--i: 3">You raise your guard.</p>
<p class="up-cinema-line" data-cinema-cue="up11-close" style="--i: 4">But it ignores it. Instead, it steps closer and extends one aged hand...</p>
<p class="up-cinema-line up-cinema-line--small" style="--i: 5">Palm open.</p>
<p class="up-cinema-line" style="--i: 6">It takes you a moment to understand.</p>
<p class="up-cinema-line" style="--i: 7">The thing you carried.</p>
<p class="up-cinema-line" style="--i: 8">The thing you refused to leave behind.</p>
<p class="up-cinema-line" style="--i: 9">Slowly, you open your hand above its own.</p>
<p class="up-cinema-line" style="--i: 10">A flickering light falls into its palm, too bright to reveal its shape.</p>
<p class="up-cinema-line" style="--i: 11">The figure closes its fingers around it and holds it close.</p>
<p class="up-cinema-line" style="--i: 12">When its hand opens again, the light is gone.</p>
<p class="up-cinema-line" style="--i: 13">Then the spear moves.</p>
<p class="up-cinema-line" style="--i: 14">Not the blade, but the butt of it, striking your chest with enough force to send you to the ground.</p>
<p class="up-cinema-line" style="--i: 15">The pain is real, but the tiredness that follows is stronger.</p>
<p class="up-cinema-line" style="--i: 16">As the empty hood looms above you, the world fades.</p>
</div>
<div class="up-cinema-actions">
<<button "<strong class='choice-text'>Wake up</strong>">><<run setup.unfinishedPilgrimageAudio.stop("ruins", { fadeMs: 900 })>><<goto "Event_Major_UnfinishedPilgrimage_12">><</button>>
</div>
</div>''<<silently>>
<<run setup.unfinishedPilgrimageAudio.stop(["ruins", "voices"], { fadeMs: 250 })>>
<<run setup.unfinishedPilgrimage.clearRetryEvent({ resolved: true })>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _unfinishedPilgrimageVictoryPowerLimitGain = 0>>
<<if !$questFlags["unfinished_pilgrimage_victory_power_limit_granted"]>>
<<set $powerLimitMax = Number($powerLimitMax ?? 1) + 2>>
<<set $questFlags["unfinished_pilgrimage_victory_power_limit_granted"] = true>>
<<set _unfinishedPilgrimageVictoryPowerLimitGain = 2>>
<</if>>
<</silently>>
''<div class="hub-textbox">
...before it comes into focus again.
You blink slowly as you get your bearings.
You are still lying down, but you are alone, in your tent. You would say it is completely quiet, but the sounds of the camp’s goings-on are already well underway.
It seems you overslept.
The first time since... perhaps ever.
Still, even with the extra sleep, you find yourself hard pressed to force yourself up. But in the end, you do. With a sigh escaping your mouth.
The tribe needs its chieftain, after all.
Still, as you go about your day, you cannot help but feel different. Like a piece of you that was missing has finally slipped back into place.
A small, weak, useless piece.
<<if _unfinishedPilgrimageVictoryPowerLimitGain > 0>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power Limit</span>
<span class="value">+2</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go about your day</span>">><<endMajorEvent>><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.play("ruins", { targetRatio: 0.55, startRatio: 0.08, fadeMs: 3200 })>>
<</silently>>
''<div class="hub-textbox">
You sit up.
Or at least, you try to.
Your eyes open to gather the shape of the world around you, and the first thing you understand is that this is not your tent.
The second is that you are not sitting at all.
Your legs are already beneath you. Your bare feet are already planted against cold stone. You do not remember standing. You do not remember leaving the camp.
For a moment, an emotion starts to wriggle within you. Panic? Paranoia?
The feeling folds in on itself before it can become anything useful, swallowed by the same heavy quiet that hangs over everything around you.
You look ahead.
Buildings line the broken street, unfamiliar and ruined, yet still touched by a strange kind of grandeur. Their walls are cracked. Their roofs have collapsed. Some seem to be missing all together. Purple mist drifts between them, thick enough to sting your eyes whenever you try to look too closely.
Your hand tightens.
Only then do you realize it is already holding something.
You do not open your fingers to see what it is. You do not need to. Some part of you understands what it is for, and where it must be taken.
There.
Right there.
You cant see it with your eyes. Its still too far.
But Its waiting all the same.
The temple.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Walk toward the temple</span>">><<goto "Event_Major_UnfinishedPilgrimage_3">><</button>>
</div>''<div class="hub-textbox">
You begin to walk.
Perhaps more slowly than you intend. Or perhaps the street is simply longer than it appears, stretching itself beneath your feet with each step.
At first, the scenery barely seems to change. Everything is ruin, haze, and silence, blending together until it becomes difficult to tell one crumbling shape from another. But after a time, differences begin to emerge.
The first buildings you pass are little more than houses. Small. Poor. Pressed so tightly together they seem to lean upon one another for support. They look as though they had been half-ruined even before time ever touched them.
Statues stand among them, cast in bronze gone brittle with age. Most have lost their heads.
You continue down the same single road.
Gradually, the houses begin to grow.
What were once cramped dwellings become larger homes, then estates, then something closer to mansions, each blending into the next as though the city itself cannot decide what it is meant to be. The statues change with them. Bronze gives way to marble, though the heads are gone all the same.
Your legs do not slow, but your eyes wander.
There.
Caught upon the edge of one decrepit mansion, you see a dress.
<<cgimg "images/events/unfinished_pilgrimage/dress.png" "A lonely dress">>
Purple. Deep, rich, imperial purple.
It hangs from a broken upper ledge, beautiful even now, and stirs as though in a wind that does not exist. It should have rotted away long ago. Should have been stolen, torn apart, or carried off by time. Yet it remains, fighting against nothing, moving in a place where nothing else does.
You want to stop, to make sense of the strange scene.
But your body has other plans, as it continues to walk.
The mansions begin to thin. Then the houses shrink once more. Then they are simply gone.
And before you realize when the change occurred, you are no longer walking a ruined street at all.
You stand before a single great building.
The temple.
Its doors are closed to you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Approach the doors</span>">><<goto "Event_Major_UnfinishedPilgrimage_4">><</button>>
</div>''<div class="hub-textbox">
You take a deep breath.
Then you press your hands against the great doors. One palm lies open against the cold surface. The other remains closed, still gripping the thing you carry.
You push.
Nothing happens.
The doors do not creak. They do not shift. They do not even seem to acknowledge the strength you put against them.
You try again.
Still nothing.
At last, you step back and look up at them properly. The thought of why you are trying to enter this place never crosses your mind. The need is simply there, buried deeper than question or doubt.
So you place your hands against the doors once more.
And this time, you
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Open the doors</span>">><<run setup.unfinishedPilgrimageAudio.playDoorCreak()>><<goto "Event_Major_UnfinishedPilgrimage_5">><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.play("ruins", { targetRatio: 0.55, startRatio: 0.55, fadeMs: 800 })>>
<<run setup.unfinishedPilgrimageAudio.play("voices", { targetRatio: 0.6, startRatio: 0.1, fadeMs: 5200 })>>
<</silently>>
''<div class="hub-textbox">
The great doors open slowly, dragging a painful creak through the silence.
A gust of wind rushes out from within the temple, strong enough to push your $hair hair back from your face. It passes over you in a single breath, cold despite the heat that brought you here.
Then it is gone.
Beyond the threshold waits the inside of the temple.
It is quiet, just as the street was quiet, but not in the same way. Outside, the silence had felt empty. Here...less so. For better or worse.
You take one step inside.
Then another.
Only then do you notice the statues.
They line the hall on either side, filling the temple in rows of kneeling bodies. Some are marble. Some are bronze. All are unmoving. All are headless.
Among them stand larger figures, rising above the kneeling masses. These, perhaps, are the ones the prayers were meant for. Their bodies are made of gold, dulled by dust and the long passage of time, yet still faintly lustrous beneath it. Unlike the smaller statues, their heads remain.
But their faces do not.
Smooth gold stares down from above, featureless and blind.
You continue forward through the hall.
It seems to go on longer than the temple should allow.
At its far end, beneath the gaze of the golden figures, waits another statue. Smaller than the rest. Kneeling like the others. Headless like the others.
But black.
Not bronze. Not marble. Not gold.
Obsidian perhaps?
Its hands are held out before it, shaped to receive something.
Your fingers tighten around the thing you carry.
At last, some buried part of you understands.
This is where it belongs.
Perhaps, if you place it there, this cursed place will finally let you leave.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Place the item in its hands</span>">><<goto "Event_Major_UnfinishedPilgrimage_6">><</button>>
<<button "<span class='choice-text'>Turn away</span>">><<goto "Event_Major_UnfinishedPilgrimage_8">><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.play("ruins", { targetRatio: 0.55, startRatio: 0.55, fadeMs: 800 })>>
<<run setup.unfinishedPilgrimageAudio.play("voices", { targetRatio: 0.8, startRatio: 0.6, fadeMs: 3600 })>>
<</silently>>
''<div class="hub-textbox">
You approach the motionless obsidian statue.
Up close, its posture seems almost proud. Though headless, though empty-handed, it presents that emptiness with a strange certainty, as though it has long known something would one day fill it.
You study it for a moment.
Then, slowly, you raise your closed hand.
For the first time, your fingers begin to uncurl.
What rests in your palm is impossible to truly see. Light spills from it the moment you reveal it, bright enough to sting your eyes and blur its shape. Yet you can still feel that shape against your skin. Solid. Definite. Real in a way the rest of this place is not.
Carefully, you lower it into the hands of the obsidian figure.
And then you wait.
Nothing happens.
For a moment, the silence remains as complete as ever.
Then your breath catches.
It becomes suddenly difficult to breathe, as though the air itself has thickened inside your chest. Your heart begins to pound. A sharp weakness runs through your limbs, and you drop to one knee before you can stop yourself.
You stay there only a moment.
When you force yourself back upright, something has changed.
You can hear.
Faint at first, but unmistakable.
Voices.
Footsteps.
The murmuring sound of life somewhere beyond the silence.
You turn toward the great doors of the temple. At some point, they have closed behind you.
The voices whisper from the other side.
You begin to walk.
As you pass through the hall, you notice the statues have changed. The kneeling figures, once turned toward the obsidian statue, are now bowed toward you instead. They do not move. Yet each one now faces your passing.
The golden figures have changed as well.
Their once-featureless faces no longer remain smooth. Little by little, shape settles into them. Brow. Nose. Mouth. Eyes.
Your eyes.
You do not linger on them.
Weaker than before, but driven all the same, you make your way to the great doors and place your hands against them. Strangely, though your body feels diminished, the doors seem far easier to move from this side than they ever were from without.
So you
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Pull</span>">><<goto "Event_Major_UnfinishedPilgrimage_7">><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.stop(["ruins", "voices"], { fadeMs: 900 })>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _unfinishedPilgrimagePowerLimitGain = 0>>
<<if !$questFlags["unfinished_pilgrimage_first_wake_power_limit_granted"]>>
<<set $powerLimitMax = Number($powerLimitMax ?? 1) + 1>>
<<set $questFlags["unfinished_pilgrimage_first_wake_power_limit_granted"] = true>>
<<set _unfinishedPilgrimagePowerLimitGain = 1>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You pull.
The doors swing open with surprising ease.
For one brief moment, you expect to see the faces waiting on the other side. The voices. The footsteps.
Instead, you are back in your tent.
You sit atop your furs, arms outstretched, fingers curled around nothing. Sweat clings to your skin. Your chest rises and falls with heavy, uneven breaths.
For a while, you do not move.
Then you swallow, wipe the sweat from your face, and slowly lower your hands.
They are empty.
Of course they are.
Still, the absence feels heavier than it should.
You are awake. Truly awake this time. Your body no longer burns, and the air no longer presses against your lungs. By all rights, you should feel relieved.
Instead, you feel different.
Not stronger, exactly.
Deeper.
As though some unseen boundary within you has shifted, making room for something that had not fit there before.
Sleep will not return to you tonight. You know that before you even try.
So, slowly, you rise from your furs and step out of your tent, carrying the memory of the ruined temple with you into the waking day.
<<if _unfinishedPilgrimagePowerLimitGain > 0>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power Limit</span>
<span class="value">+1</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go about your day</span>">><<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("HiddenMemories") : null>><<endMajorEvent>><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.play("ruins", { targetRatio: 0.55, startRatio: 0.55, fadeMs: 800 })>>
<<run setup.unfinishedPilgrimageAudio.play("voices", { targetRatio: 0.8, startRatio: 0.6, fadeMs: 3600 })>>
<</silently>>
''<div class="hub-textbox">
A part of you wants to open your palm and place the thing into the obsidian statue’s hands.
The part that wants this to be over. To leave this acursed place.
You do not know how you know it, but you do. If you open your hand here, if you give the statue what it waits for, then you will not be able to return to this moment.. Whatever this place is asking of you will be done.
That should be fine....but it stops you.
Your fingers remain closed.
For a while, you simply stand there before the kneeling obsidian figure, feeling the light press against the inside of your palm.
Then you take one step back.
Then another.
Finally, you turn away.
Why?
The dress, perhaps.
Or something else.
Only you know that.
You make your way back through the hall. The statues remain as they were, kneeling and unmoving, trapped forever in the act of waiting.
Each step feels heavier than the last. The great doors should draw closer, yet for a time they seem to retreat from you, stretching the hall longer with every breath.
Until they do not.
Until your hands find the handles.
You pull.
The doors resist.
You pull again, harder this time, but they do not move. They feel heavier than before. Angrier, perhaps, though you know how foolish that thought is.
Still, you do not let go.
You pull until your arms ache.
You pull until your breath tears in your chest.
You pull until something finally gives.
Not the doors.
The hinges.
With a sharp crack, the great doors lurch loose from their frame, and you fall backward with them, crashing hard onto cold stone.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go on</span>">><<run setup.unfinishedPilgrimage.gotoCinema()>><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimageAudio.stop(["ruins", "voices"], { fadeMs: 900 })>>
<<run (function () {
try {
if (setup.unfinishedPilgrimage && setup.unfinishedPilgrimage.hiddenMemoriesTimer) {
clearTimeout(setup.unfinishedPilgrimage.hiddenMemoriesTimer);
}
setup.unfinishedPilgrimage.hiddenMemoriesTimer = setTimeout(function () {
try {
if (SugarCube.State.passage !== "Event_Major_UnfinishedPilgrimage_9") return;
if (setup.clashV1 && typeof setup.clashV1.playHiddenMemoriesClashMusic === "function") {
setup.clashV1.playHiddenMemoriesClashMusic({ durationMs: 4500 });
}
} catch (e) {
console.error(e);
}
}, 5000);
} catch (e) {
console.error(e);
}
})()>>
<<run setup.unfinishedPilgrimage.resolveCinemaEntrance()>>
<</silently>>
''<div class="unfinished-pilgrimage-cinema no-click-sfx">
<div class="up-cinema-bg up-cinema-bg--sky"></div>
<div class="up-cinema-bg up-cinema-bg--outside"></div>
<div class="up-cinema-bg up-cinema-bg--inside"></div>
<div class="up-cinema-vignette"></div>
<div class="up-cinema-lines" aria-live="polite">
<p class="up-cinema-line" style="--i: 0">Your back hits the ground.</p>
<p class="up-cinema-line" style="--i: 1">For a moment, you can only stare upward.</p>
<p class="up-cinema-line" style="--i: 2">But the ruined dome of the temple is gone.</p>
<p class="up-cinema-line" style="--i: 3">Above you stretches an endless purple sky.</p>
<p class="up-cinema-line" style="--i: 4">Ruined, somehow, in its own right.</p>
<p class="up-cinema-line" style="--i: 5">You force yourself to stand.</p>
<p class="up-cinema-line" style="--i: 6">The temple is nowhere to be found.</p>
<p class="up-cinema-line" style="--i: 7">In its place stands a small ruined house.</p>
<p class="up-cinema-line" style="--i: 8">Its door hangs open.</p>
<p class="up-cinema-line up-cinema-line--small" style="--i: 9">Waiting.</p>
<p class="up-cinema-line" style="--i: 10">Something compels you forward.</p>
<p class="up-cinema-line" style="--i: 11">And so you enter.</p>
<p class="up-cinema-line" style="--i: 12">The door creaks as it moves, welcoming its first visitor in ages.</p>
<p class="up-cinema-line" style="--i: 13">Inside, there is little to see.</p>
<p class="up-cinema-line up-cinema-line--small" style="--i: 14">Dust. Rot.</p>
<p class="up-cinema-line" style="--i: 15">The remains of a life long abandoned.</p>
<p class="up-cinema-line" style="--i: 16">And yet, something in your chest aches with recognition.</p>
<p class="up-cinema-line up-cinema-line--small" style="--i: 17">Nostalgia.</p>
<p class="up-cinema-line" style="--i: 18">You notice another door at the far end of the room.</p>
<p class="up-cinema-line up-cinema-line--small" style="--i: 19">Barely open.</p>
<p class="up-cinema-line" style="--i: 20">You take one hesitant step toward it.</p>
<p class="up-cinema-line" style="--i: 21">Somehow, that is enough to reach it.</p>
<p class="up-cinema-line" style="--i: 22">Your hand settles on the door.</p>
<p class="up-cinema-line" style="--i: 23">For the second time, you hesitate.</p>
<p class="up-cinema-line" style="--i: 24">Then you</p>
</div>
<div class="up-cinema-actions">
<<button "<span class='choice-text'>enter the yard.</span>">><<run setup.unfinishedPilgrimage.gotoYardCinema()>><</button>>
</div>
</div>''<<silently>>
<<run setup.clashV1.stopBattleMusic()>>
<<run setup.unfinishedPilgrimageAudio.stop(["ruins", "voices"], { fadeMs: 250 })>>
<<run setup.unfinishedPilgrimage.enableRetryEvent()>>
<</silently>>
''<div class="hub-textbox">
The spear speeds towards you!
But just as it is about to connect-
Instead of feeling pain, your eyes open as you jump up, looking around your tent, sweat pouring down your forehead.
After taking a few moments to calm down, it becomes clear that whatever happened, it was just a dream. So you get up, and go about your day.
But still.
If it was just a dream...
Why do you feel so... incomplete?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go about your day</span>">><<goto "Event_Screen">><</button>>
</div><<silently>>
<<run setup.unfinishedPilgrimage.enterRetryChoice()>>
<</silently>>
''<div class="hub-textbox">
As you finish up your day, and prepare to go to sleep, a memory keeps nagging at the back of your head.
Of that place you visited.
That... dream.
You feel it calling for you. Whatever it is.
But as you recall it, one place in particular seems to take precedence in your mind.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>The beginning</span>">><<goto "Event_Major_UnfinishedPilgrimage">><</button>>
<<button "<span class='choice-text'>The fight</span>">><<run setup.stopAllAudio ? setup.stopAllAudio() : null>><<goto "Event_Major_UnfinishedPilgrimage_10">><</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _data = _ev && _ev.data ? _ev.data : {}>>
<<set _captives = Number(_data.captives ?? 0)>>
<<set _targetName = _data.targetName ?? "the defeated tribe">>
<<set _swayCost = 10>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<</silently>>
''<div class="hub-textbox">
<<if _captives > 0>>
The raid of <<print _targetName>> was succsesful.
<<else>>
The raid was a grand succsess
<</if>>
And, like after every successful outing, it brings with it spoils. As chieftain, of course, you always get first pickings.
The captured women are brought before you, each beautiful in their own right. They stand in a line, wrists bound, expressions ranging from fear to resignation to careful calculation.
Yet one among them seems more persistent than the rest.
She stands taller than the others. Her jaw is set. Her eyes burn with something that is not quite hatred but certainly not submission. She has not flinched since being dragged before you.
Perhaps a dead brother. Perhaps a lover. You do not know. What you do know is that she certainly does not seem pleased to be away from her tribe.
That will not do.
These types tend to sow discord and instability if left unchecked. The question is—how do you deal with her?
</div>''
<div class="hub-buttons">
<<button "Show them why you lead">>
<<set $warOfferingApproach = "endurance">>
<<goto "Event_Major_WarOffering_Result">>
<</button>>
<<button "Explain their role">>
<<set $warOfferingApproach = "charisma">>
<<goto "Event_Major_WarOffering_Result">>
<</button>>
<<if _canSway>>
<<button "Sway her to your cause (Sway: <<print _swayCost>> Belief)">>
<<set $warOfferingApproach = "sway">>
<<goto "Event_Major_WarOffering_Result">>
<</button>>
<<else>>
<span class="macro-button disabled" title="<<print _hasSway ? ('Need ' + _swayCost + ' Belief.') : 'You have not acquired Sway.'>>">Sway her to your cause (Sway: <<print _swayCost>> Belief)</span>
<</if>>
</div><<silently>>
<<set _approach = $warOfferingApproach ?? "charisma">>
<<set _swayCost = 10>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<<if _approach is "sway" and !_canSway>><<set _approach = "charisma">><</if>>
<<set _isSway = (_approach is "sway")>>
<<set _isEndurance = (_approach is "endurance")>>
<<set _dc = _isSway ? 0 : (_isEndurance ? 11 : 13)>>
<<set _label = _isSway ? "Sway" : (_isEndurance ? "Endurance" : "Charisma")>>
<<set _stat = _isSway ? 0 : (_isEndurance ? setup.player.getStatForCheck("endurance") : setup.player.getStatForCheck("charisma"))>>
<<set _roll = _isSway ? 0 : random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = _isSway ? true : (_total >= _dc)>>
<<set _stabilityChange = _isSway ? 20 : (_success ? 10 : -10)>>
<<if _isSway>><<set $belief = Math.max(0, Number($belief ?? 0) - _swayCost)>><</if>>
<<set $stability = Number($stability ?? 0) + _stabilityChange>>
<</silently>>
''<div class="hub-textbox">
<<if _isSway>>
You step closer. Your power gathers.
You speak. Simple words. Words about belonging. About purpose. About how good it feels to serve.
Her eyes narrow at first. Defiant. But your words settle into her mind like warm honey. Each sentence makes more sense than the last. Each phrase untangles another knot of resistance.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">You...what are you-</span>
</div>
You continue speaking. Calm. Patient. The defiance in her expression flickers. Her mind is more suseptible to your power than most. Perhaps the show of strong will was a mere facade.
Her jaw relaxes. Her shoulders drop. The fire in her eyes dims, replaced by something softer.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">Yes. You are right. That... that makes sense.</span>
</div>
You guide her to the furs. She follows without hesitation. Her body responds to your touch with eager heat...wet and willing where defiance once lived.
When you finish, she clings to you. Her eyes are soft. Devoted. The woman who stood tall and furious an hour ago has been reshaped entirely.
<<nsfwimg "images/events/WarOffering/sway.webp">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">Thank you. Thank you for showing me my purpose.</span>
</div>
She presses against you. Eager. Obedient. Ready to serve however you wish.
Turning critics into devout supporters is a useful skill to have, isn't it?
<<elseif _isEndurance>>
<<if _success>>
You gesture to your warriors. They understand.
The woman's eyes widen as hands grip her arms, forcing her to her knees. Her defiance holds...Until you step forward.
<<nsfwimg "images/events/WarOffering/lead.webm">>
You take her. Your warriors hold her steady. Her struggles weaken with each thrust. What starts as defiance becomes gasps. What becomes gasps turns to moans.
Her body betrays her. Wet heat builds despite her fury. By the end, her thighs are trembling for different reasons.
<<nsfwimg "images/events/WarOffering/lead1.webm">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">You... you...</span>
</div>
She collapses forward, breathless. The fire in her eyes has dimmed to embers. Maybe she learnt her lesson. Maybe she didn't. But the others certanly did.
<<else>>
You gesture to your warriors. They understand.
The woman's eyes widen as hands grip her arms, forcing her to her knees. Her defiance holds...Until you step forward.
<<nsfwimg "images/events/WarOffering/lead.webm">>
You take her. Your warriors hold her steady. But her struggles are relentless. She bites. She kicks. Her body tenses against every thrust, refusing to yield outwardly, even as her body enjoys your presence.
The demonstration falters. She spits at your feet when finished, eyes still burning.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">Is that all your 'strength' amounts to?</span>
</div>
Your warriors shift uneasily. She will need more convincing...And maybe a few of the other will too.
<</if>>
<<else>>
<<if _success>>
You dismiss your warriors. You speak to the women without them.
Her eyes narrow. Waiting for lies. Waiting for threats.
You speak of the tribe. Of protection. Of status. Of what it means to belong to the a chieftains bed versus the alternative.
Her expression shifts. The anger remains still, but calculation replaces blind fury. She studies you. Weighing.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">And if I refuse?</span>
</div>
You outline the alternative. Quite Vividly...Afterwards you let the silence fill the air for a moment, before you start painting a picture with honeyed words again of benefits. Of submission. Of the...correct choice. Her eyes close. A long breath. When she opens them again, something has changed.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">Then I accept.</span>
</div>
You gesture toward the line of captured women still watching from across the dwelling. Their eyes are wide. Some fearful...Some curious.
She understands. She sinks to her knees before you. The other women watch as her mouth opens. As her lips wrap around you.
<<nsfwimg "images/events/WarOffering/charisma.webm">>
She works your member quite efficently. Her head bobs slowly. Wet sounds fill the air. The other women shift uneasily, unable to look away.
<<nsfwimg "images/events/WarOffering/charisma1.webp">>
When you finish, she swallows without hesitation. Rises. Wipes her mouth.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">I have accepted my role. Now lets see what submission will earn me</span>
</div>
The other women exchange glances. The lesson has been delivered, and they will all soon be eating out of the palm of your hand
<<else>>
You dismiss your warriors. You speak to the women without them.
Her eyes narrow. Waiting for lies. Waiting for threats.
...But your words fall flat. She listens, arms crossed, jaw tight. When you finish, she stares at you with cold contempt.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Woman</span>
<span class="dialogue-line">Pretty words. Empty words. You think I will spread my legs because you ask nicely?</span>
</div>
She turns away. The conversation is over as far as shes concerned. Whatever you do next, it will do little to fix your authority among these new members of your tribe, after being so openly challenged.
<</if>>
<</if>>
<<if _isSway>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power used</span>
<span class="value">SWAY</span>
</div>
<div class="result-line">
<span class="label">Belief spent</span>
<span class="value">-<<print _swayCost>></span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+<<print _stabilityChange>></span>
</div>
</div>
<<else>>
<div class="result-list result-list-check">
<div class="result-line <<if _success>>good<<else>>bad<</if>>">
<span class="label"><<print _label>> check</span>
<span class="value"><<if _success>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line <<if _success>>good<<else>>bad<</if>>">
<span class="label">Stability</span>
<span class="value"><<if _stabilityChange > 0>>+<</if>><<print _stabilityChange>></span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Let the lesson stand.">>
<<unset $warOfferingApproach>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<if !_entry and $eventQueue and $eventQueue.length>><<set _entry = $eventQueue.find(e => e && String(e.id ?? "") === "major_tradition_warm_furs") ?? null>><<if _entry>><<set $currentEvent = _entry>><</if>><</if>>
<<set _data = (_entry and _entry.event and _entry.event.data) ? _entry.event.data : {}>>
<<if !_data.concubineName>>
<<set _pickedConcubine = setup.traditionEvents.pickWarmFursConcubine()>>
<<if _pickedConcubine>>
<<set _data = { concubineId: _pickedConcubine.id, concubineName: _pickedConcubine.name, concubineAptitude: _pickedConcubine.aptitudeId, traditionLevelId: setup.traditionEvents.getBondsOfFleshLevelId() }>>
<<if _entry and _entry.event>><<set _entry.event.data = Object.assign({}, _entry.event.data ?? {}, _data)>><</if>>
<</if>>
<</if>>
<<set _concubineName = _data.concubineName ?? "Your concubine">>
<<set _warmFursResult = _entry ? setup.traditionEvents.applyWarmFursOutcome(_entry) : { npcName: _concubineName, loveGain: 0, applied: false }>>
<</silently>>
''<div class="hub-textbox">
The path to your tent is short and familiar, packed earth worn smooth beneath your feet. The tribe settles behind you - low murmurs, the pop of cooling embers, a dog barking once somewhere past the storehouses.
You push through the hide flap. Warmth presses against your face, the interior glowing amber from a clay lamp set on a low wooden stool. Dried lavender hangs from the center pole, its scent mingling with the smell of tanned pelts.
<<print _concubineName>> lies across your sleeping furs, completely bare, her body draped across the pelts with an easy confidence. The lamplight traces the slope of her waist, the full weight of her breasts pressing soft against the fur beneath her, her skin glowing in warm tones of brown. She turns her head when you enter, her hair spilling across the pelts, her lips parting into a quiet smile.
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print _concubineName>></span>
<span class="dialogue-line">"You carry so much for all of us, $user. Come here and let me take care of you tonight."</span>
</div>
She rises onto her elbow, her breasts swaying with the motion, one knee drawing up to reveal the shadowed line between her thighs. Her free hand pats the furs beside her hip, her eyes holding yours with steady warmth.
You cross the tent and lower yourself into the waiting heat of her embrace.
<<nsfwimg "images/events/warm_furs/sex.webm">>
<<if _warmFursResult and _warmFursResult.loveGain > 0>>
<div class="result-list">
<div class="result-line good">
<span class="label">Love</span>
<span class="value">+<<print _warmFursResult.loveGain>> with <<print _warmFursResult.npcName>></span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "And so the night goes on...">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = setup.whereBlessingFalls.getCurrentEntry()>>
<<set _state = setup.whereBlessingFalls.ensureState(_entry)>>
<<set _spark = setup.whereBlessingFalls.getSparkAvailability()>>
<<set _riteKeeper = setup.whereBlessingFalls.getRiteKeeper()>>
<</silently>>
''<div class="hub-textbox">
<br>
A small group waits near the edge of camp, prepared to leave.
Their tools are ready. Packs have been checked, weapons gathered, and whatever last arrangements were needed have already been made.
Still, no one moves.
At first you assume something has been forgotten. Then one of them approaches, and the reason becomes clear.
They want your blessing before they go.
The habit has grown quietly. A few words before a hunt. A hand raised over those leaving on a difficult task. Some small acknowledgement that they depart with more than their own preparation behind them.
Not everyone seems equally convinced. A few glance toward the waiting paths as though eager to simply get moving.
But none of them leave.
They are waiting to see where the blessing will come from.
</div>''
<div class="hub-buttons">
<<button "Give them your blessing personally.">><<run setup.whereBlessingFalls.selectChoice(_entry, "personal")>><<goto "Event_Major_WhereBlessingFalls_Resolve">><</button>>
<<if _spark.canUse>>
<<button "Give them something more than words. — Spark">><<run setup.whereBlessingFalls.selectChoice(_entry, "spark")>><<goto "Event_Major_WhereBlessingFalls_Resolve">><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="<<print _spark.tooltip>>">Give them something more than words(Spark: 20 Belief)</span>
<</if>>
<<if _riteKeeper>>
<<button "Have the Rite Keeper bless them.">><<run setup.whereBlessingFalls.selectChoice(_entry, "rite_keeper")>><<goto "Event_Major_WhereBlessingFalls_Resolve">><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires an assigned Rite Keeper.">Have the Rite Keeper bless them.</span>
<</if>>
<<button "Tell them to seek the spirits’ favour.">><<run setup.whereBlessingFalls.selectChoice(_entry, "spirits")>><<goto "Event_Major_WhereBlessingFalls_Resolve">><</button>>
</div><<silently>>
<<set _entry = setup.whereBlessingFalls.getCurrentEntry()>>
<<set _result = setup.whereBlessingFalls.applyOutcome(_entry)>>
<<set _state = setup.whereBlessingFalls.ensureState(_entry)>>
<<set _endLabel = "End Event">>
<<if _result>>
<<if _result.choice is "personal" or _result.choice is "spark">>
<<set _endLabel = "Send them on under your blessing.">>
<<elseif _result.choice is "rite_keeper">>
<<set _endLabel = "Let the spirits have their due.">>
<<elseif _result.choice is "spirits">>
<<set _endLabel = "Let them seek favour elsewhere.">>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _result and _result.choice is "personal">>
<div class="result-list result-list-check">
<<if _result.success>>
<div class="result-line good"><span class="label">Charisma check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Charisma check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
</div>
You step forward and give them what they came for.
There is little need for spectacle. You gather them close, offer the familiar words and gestures, and send them toward the work ahead beneath your favour.
<<if _result.success>>
Whatever uncertainty lingered among them fades.
Heads lower. Shoulders straighten. By the time you finish, even those who had seemed impatient are listening closely.
When the group finally departs, they do so with noticeably lighter steps.
For a little while longer, at least, your blessing feels like something worth waiting for.
<<else>>
The words come, but the moment never quite settles around them.
A few listen respectfully. Others shift where they stand, waiting for some weight or certainty that never arrives.
No one openly questions the rite. When you finish, they acknowledge the blessing and prepare to leave.
Still, as they disperse, you cannot help noticing how quickly ordinary conversation returns.
It seems your words did not leave the impact you hoped they would.
<</if>>
<<print setup.whereBlessingFalls.resultRowsHtml(_result.rows)>>
<<elseif _result and _result.choice is "spark">>
You raise a hand before they can depart.
You open your palm, and then...
A small white flame erupts from it.
Several smaller flames split away and begin circling your people. They drift just close enough for their warmth to be felt without burning them, tracing slow circles through the air before gradually fading away.
Whatever doubts existed moments ago disappear beneath the awe of having witnessed something small, yet wondrous.
A blessing asked of their chieftain was answered with floating fire.
The group leaves soon afterward.
Several glance back before they disappear from sight.
<<print setup.whereBlessingFalls.resultRowsHtml(_result.rows)>>
<<elseif _result and _result.choice is "rite_keeper">>
You turn their request elsewhere.
The Rite Keeper, <<print _result.riteKeeperName>>, is called forward and takes your place before the waiting group.
There is no hesitation. This is familiar work: a few prepared words, a careful gesture, the small signs and observances that have gathered around departures such as this.
The group accepts the blessing readily.
Some still glance toward you when it is finished, but no one seems disappointed.
The sacred has been acknowledged.
It simply did not need to pass through your hands.
<<print setup.whereBlessingFalls.resultRowsHtml(_result.rows)>>
<<elseif _result and _result.choice is "spirits">>
You refuse to make yourself the centre of the rite.
If they believe favour is needed before they leave, there are more appropriate places to seek it. The spirits do not wait upon your permission, nor does every blessing need to begin with the chieftain.
The answer unsettles some of them.
A few had clearly expected your hand, your words, and the reassurance that has begun to accompany them.
Others accept the decision more easily.
Before long, the group turns toward the small offerings, familiar signs, and quiet habits through which the tribe has always sought favour beyond itself.
<<print setup.whereBlessingFalls.resultRowsHtml(_result.rows)>>
<</if>>
</div>''
<div class="hub-buttons">
<<button _endLabel>><<endMajorEvent>><</button>></div><<silently>>
<<set _quest = setup.whiteAntler.beginQuest()>>
<</silently>>
''<div class="hub-textbox">
The White Antler
The hunters return with less food than expected.
Usually that would be enough to sour the mood around the fire.
Today, few seem to care.
They speak instead of something seen between the trees.
<div class="dialogue-inset">
<span class="dialogue-speaker">Hunter</span>
<span class="dialogue-line">"A stag. We saw it. It was... it was like no stag I've ever seen. Twice the size of a normal one, with antlers to match. And its fur... It was..."</span>
</div>
"A stag. We saw it. It was... it was like no stag I've ever seen. Twice the size of a normal one, with antlers to match. And its fur... It was..."
White.
Not the dirty grey of winter fur or the pale hide of an old animal. White from muzzle to tail, bright enough to stand apart even beneath the shade of the trees.
They tried to bring it down.
The stag was already moving before the first hunter came close enough to strike. A thrown spear caught only a glancing blow before the animal disappeared deeper into the wilds.
They followed for as long as they could.
Yet it eluded them at every turn.
It seems this prey was too elusive for your hunters to catch.
Perhaps you will prove a more fitting predator, should you choose to dedicate the time to hunting it.
<div class="result-list">
<div class="result-line good"><span class="label">Task added</span><span class="value">The White Antler</span></div>
<div class="result-line"><span class="label">Objective</span><span class="value">Investigate the White Antler's trail near the camp.</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "Begin the hunt.">><<endMajorEvent>><</button>>
</div><<silently>>
<<set _entry = setup.whoSleepsBesideYou.getCurrentEntry()>>
<<set _scene = setup.whoSleepsBesideYou.getScene(_entry)>>
<<if _scene.valid>>
<<set _aName = _scene.aName>>
<<set _bName = _scene.bName>>
<<set _choiceA = setup.whoSleepsBesideYou.choiceLabel("Spend the night with " + _aName + ".")>>
<<set _choiceB = setup.whoSleepsBesideYou.choiceLabel("Spend the night with " + _bName + ".")>>
<<set _choiceBoth = setup.whoSleepsBesideYou.choiceLabel("Why choose?")>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_scene.valid>>
<<print _scene.reason>>
<<else>>
The camp has begun settling by the time you return to your tent. Most of the fires outside have burned low, leaving only scattered voices and the occasional burst of laughter from those not yet ready to sleep.
Someone is already waiting for you inside.
<b><<print _aName>></b> sits near the sleeping furs, having made herself comfortable while you were away. Most of what she wore during the day has been set neatly aside, leaving her dressed lightly for the night. She looks up when you enter and gives you an easy smile.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"You took long enough."</span>
</div>
There is no real complaint behind it. She shifts farther onto the furs, clearly having expected the rest of the evening to be straightforward.
You have barely begun settling in when the tent flap moves again.
<b><<print _bName>></b> steps inside.
She stops almost immediately.
Her eyes move from you to <b><<print _aName>></b>, then to the clothing folded beside the furs.
For a moment, nobody says anything.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"Oh."</span>
</div>
<b><<print _aName>></b> straightens slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"What are you doing here?"</span>
</div>
The question earns her a look.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"I was about to ask you the same thing."</span>
</div>
Neither sounds particularly angry yet, but whatever relaxed mood existed a few moments ago has disappeared.
<b><<print _aName>></b> looks toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"I thought I was staying with you tonight."</span>
</div>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"So did I."</span>
</div>
That seems to settle the problem only in the sense that everyone now understands exactly what it is.
The two women look at one another again. Neither appears inclined to volunteer to leave first.
The silence stretches for another moment. Neither woman seems willing to be the first to leave.
Eventually, both look to you.
<</if>>
</div>''
<div class="hub-buttons">
<<if !_scene.valid>>
<<button "<span class='choice-text'>Return to your evening.</span>">><<endMajorEvent>><</button>>
<<else>>
<<button _choiceA>><<run setup.whoSleepsBesideYou.choose(_entry, "a")>><<goto "Event_Major_WhoSleepsBesideYou_Resolve">><</button>>
<<button _choiceB>><<run setup.whoSleepsBesideYou.choose(_entry, "b")>><<goto "Event_Major_WhoSleepsBesideYou_Resolve">><</button>>
<<button _choiceBoth>><<run setup.whoSleepsBesideYou.choose(_entry, "both")>><<goto "Event_Major_WhoSleepsBesideYou_Resolve">><</button>>
<</if>>
</div><<silently>>
<<set _entry = setup.whoSleepsBesideYou.getCurrentEntry()>>
<<set _result = setup.whoSleepsBesideYou.resolve(_entry)>>
<<if _result.valid>>
<<set _aName = _result.aName>>
<<set _bName = _result.bName>>
<</if>>
<<set _endLabel = "Continue.">>
<<if _result.valid>>
<<if _result.choice is "a" or _result.choice is "b">>
<<set _endLabel = "Settle in for the night.">>
<<elseif _result.check and _result.check.success>>
<<set _endLabel = "Try to find room under the furs.">>
<<else>>
<<set _endLabel = "Probably best to sleep.">>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_result.valid>>
<<print _result.reason>>
<<elseif _result.choice is "a">>
You meet <b><<print _aName>></b>'s eyes and gesture toward the furs beside you.
<b><<print _bName>></b> understands before anything needs to be said. Her expression tightens slightly, but she does not argue. She gathers herself, gives the other woman one last glance, and turns toward the tent flap.
<b><<print _aName>></b> watches her leave before looking back to you.
Whatever awkwardness had filled the tent a moment ago begins to fade.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Well... I suppose that settles it."</span>
</div>
She moves closer.
Once the flap falls closed behind <<print _bName>>, <<print _aName>>'s attention returns fully to you. The last of the awkwardness gives way as she rises from the furs to meet you, the hide she wore slipping aside as the two of you sink back down together. Her bare breasts press against you as she straddles your hips and frees your cock from your clothes.
She is already wet when she lowers herself onto you, taking your full length slowly before beginning to move.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Took you long enough to decide."</span>
</div>
The words come between uneven breaths as her pace quickens. She rides you with rolling hips, palms braced against your chest, no longer paying any attention to the interruption that brought the two women into the same tent.
<img src="images/events/who_sleeps_beside_you/single_a.webp" alt="Amogus">
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Now give me what I came for."</span>
</div>
Her breathing turns ragged as she keeps moving above you.
<<nsfwimg "images/events/who_sleeps_beside_you/single_a_1.webp">>
When she cums, her body tightens around your cock and she shudders hard against you. You follow soon after, filling her while she continues to rock through the last of it.
<<nsfwimg "images/events/who_sleeps_beside_you/single_a_2.webp">>
By the time the two of you finally settle beneath the furs, the earlier interruption feels distant.
<b><<print _aName>></b> remains close, clearly pleased with how the evening turned out. Outside, the camp has gone almost completely quiet.
Apparently, there are worse problems to have than too many people wanting to share your bed.
<div class="result-list">
<div class="result-line good"><span class="label"><<print _aName>> Love</span><span class="value">+15</span></div>
<div class="result-line bad"><span class="label"><<print _bName>> Love</span><span class="value">-10</span></div>
</div>
<<elseif _result.choice is "b">>
You look toward <b><<print _bName>></b> and make your choice clear.
For a moment, <b><<print _aName>></b> says nothing. Then she exhales through her nose, gathers the things she had left beside the sleeping furs, and rises.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Fine."</span>
</div>
There is enough in the word to suggest she might remember this tomorrow, but she does not make a scene of it. A moment later the tent flap falls closed behind her.
<b><<print _bName>></b> follows her departure with her eyes, then turns back toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"I wasn't sure you were going to pick me."</span>
</div>
There is no uncertainty left once she comes closer.
When you draw <<print _bName>> down onto the furs, the last of her hesitation gives way. You peel away the layers she wore into the tent, letting your hands move over her bare body before slipping between her thighs.
She gasps when your fingers find her cunt, already wet, and her hips rise eagerly into your touch.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"I hoped you would pick me."</span>
</div>
You turn her onto her back and push her knees apart, sliding your cock into her tight heat. Her hands close around your shoulders as she rocks up to meet each thrust, the effort to stay quiet becoming less convincing with every movement.
<<nsfwimg "images/events/who_sleeps_beside_you/single_b.webp">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"Do not stop."</span>
</div>
She finishes with a muffled cry against your neck, her whole body tensing around you. You follow soon after, pumping cum deep inside her as her grip on you slowly loosens.
<<nsfwimg "images/events/who_sleeps_beside_you/single_b_1.webp">>
Later, <b><<print _bName>></b> lies comfortably beside you beneath the furs, whatever tension she carried into the tent long since gone.
The matter may not be quite as forgotten by <b><<print _aName>></b>, but that is a concern for another time.
Tonight, at least, your choice has been made.
<div class="result-list">
<div class="result-line good"><span class="label"><<print _bName>> Love</span><span class="value">+15</span></div>
<div class="result-line bad"><span class="label"><<print _aName>> Love</span><span class="value">-10</span></div>
</div>
<<elseif _result.check and _result.check.success>>
<div class="result-list result-list-check">
<div class="result-line good"><span class="label">Charisma check</span><span class="value">SUCCESS</span></div>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.check.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _result.check.total>> / <<print _result.check.dc>></span></div>
</div>
You let the silence linger for another moment before looking between them.
There is an obvious solution.
You suggest that neither of them has to leave.
Both women stare at you.
Then they look at one another.
For a few uncomfortable seconds, it is difficult to tell whether you have solved the problem or merely made it considerably worse.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Both of us?"</span>
</div>
You confirm that she understood you perfectly well.
Another glance passes between them. This one lasts longer.
Whatever objection either woman might have had does not survive it.
<b><<print _bName>></b> is the first to move, reaching back to pull the tent flap properly closed.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"Well... if she isn't leaving."</span>
</div>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"Neither am I."</span>
</div>
The problem of who will share your bed tonight appears to have resolved itself.
The hesitation between them does not last long. They begin undressing, the same quiet competition that brought them both into your tent following them onto the furs. <<print _aName>> presses her bare breasts against you while <<print _bName>> drops lower and takes your cock between her lips, her tongue circling the head until you throb against her mouth.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _aName>></span>
<span class="dialogue-line">"His cock is mine first."</span>
</div>
<<print _aName>> guides <<print _bName>>'s head aside with one hand. <<print _bName>> looks up at her, breathless, before climbing back toward you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"Then we share."</span>
</div>
She claims your mouth with hers while <<print _aName>> shifts closer. A moment later both women are on the furs beside you, the earlier question of who would stay giving way to something neither of them had expected when they entered.
You fuck <<print _bName>> first while your fingers work between <<print _aName>>'s thighs,
<<nsfwimg "images/events/who_sleeps_beside_you/duo1.gif">>
...then swap between them, driving into <<print _aName>> while <<print _bName>> presses close against your side and whispers into your ear.
<img src="images/events/who_sleeps_beside_you/duo2.webp" alt="Amogus">
They cum in turn, clutching at you and one another for balance, until all three of you are breathing hard and struggling to keep any rhythm at all.
<<nsfwimg "images/events/who_sleeps_beside_you/duo3.webp">>
When you finally release, both women press close to catch your cum across their skin. The three of you eventually collapse together on the furs, breathless and spent.
Some time later, the three of you are left tangled together beneath the furs, with considerably less space than any of you would have had alone.
Whatever rivalry brought both women into your tent has been put aside for the night. Whether the arrangement will make tomorrow any less complicated is another question.
For now, neither seems particularly interested in answering it.
<div class="result-list">
<div class="result-line good"><span class="label"><<print _aName>> Love</span><span class="value">+8</span></div>
<div class="result-line good"><span class="label"><<print _bName>> Love</span><span class="value">+8</span></div>
</div>
<<else>>
<div class="result-list result-list-check">
<div class="result-line bad"><span class="label">Charisma check</span><span class="value">FAIL</span></div>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.check.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _result.check.total>> / <<print _result.check.dc>></span></div>
</div>
You let the silence linger for another moment before looking between them.
There is an obvious solution.
You suggest that neither of them has to leave.
For a moment, neither woman answers.
<b><<print _aName>></b> looks toward <b><<print _bName>></b>, and the glance that passes between them makes it clear that the suggestion has not landed quite as well as you intended.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker"><<print _bName>></span>
<span class="dialogue-line">"I... think I just remembered something I need to do."</span>
</div>
The excuse is not especially convincing, but neither of you challenges it.
She gathers herself and slips out through the tent flap, leaving the two of you behind.
<b><<print _aName>></b> watches her go, then looks back toward you. Whatever expectation she had brought with her earlier seems to have vanished along with the mood.
Without another word, she settles onto the furs, pulls them around herself, and turns onto her side.
A few moments later, it becomes clear that she has decided the night is over.
Your solution has at least settled the question of who will be sharing your bed.
<<if _result.aDelta < 0>>
<div class="result-list">
<div class="result-line bad"><span class="label"><<print _aName>> Love</span><span class="value"><<print _result.aDelta>></span></div>
<div class="result-line bad"><span class="label"><<print _bName>> Love</span><span class="value"><<print _result.bDelta>></span></div>
</div>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<button _endLabel>><<endMajorEvent>><</button>>
</div><<silently>>
<<set _kaelPresent = false>>
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is "npc_kael">>
<<set _kaelPresent = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>''<div class="hub-textbox">
It has been a few days since you brought the wildling back to camp.
For most of that time she has remained half-conscious at best, burning with fever and too weak to do much more than glare whenever you enter the tent.
Today is different.
A harsh cry cuts through the camp, followed by the sounds of a struggle.
When you reach the tent, one of your hunters is trying to keep the wildling from slipping past him. She is weak, feverish, and still she fights like something cornered, teeth bared and hands clawing for even the smallest opening.
<<if _kaelPresent>>
Kael stands nearby with his arms crossed, watching the scene with a calm that only makes the chaos around him seem louder.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Third time today,</span>
<span class="dialogue-bridge">He says, tipping his head toward the tent flap.</span>
<span class="dialogue-line">She still wants out more than she wants sense. And from the look of her, the fever has not broken either.</span>
</div>
<</if>>
You step in before the whole thing turns into a spectacle.
The wildling twists and thrashes when you take hold of her, but once she realizes it is you, some of the blind violence leaves her. Not trust. Not surrender. Just enough recognition for you to force the situation back under control and shove her into the tent once more.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Follow her inside</span>">>
<<goto "Event_Major_WildHeart_1">>
<</button>>
</div>''<div class="hub-textbox">
Once you have her inside, you finally notice how hot her skin is beneath your grip. Whatever fury keeps her moving, the fever has not loosened its hold.
You signal the guard to fetch Old Morag.
Only after he hurries off do you let the wildling pull free of you. She stumbles back several steps and raises her arms defensively, though the heavy way she breathes makes it clear that, right now, the gesture is more pride than threat.
You raise your own hands slowly in answer.
It works, at least enough to keep her from lunging again.
Instead she begins signing sharply at you, each movement full of strain and anger. Even so, the meaning is plain enough.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Wildling</span>
<span class="dialogue-line">I. Want. Out.</span>
</div>
You look at her for a moment, then shake your head.
Whatever else this is, letting her stagger back into the wild like this would be little different from leaving her to die.
Her eyes widen for an instant, perhaps because you understood her at all.
Then they narrow.
And just as it seems she is about to launch into another furious exchange, someone steps through the flap behind you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Another person enters the tent</span>">>
<<goto "Event_Major_WildHeart_2">>
<</button>>
</div><<silently>><<run setup.wildHeart.createLakeQuest()>><<run setup.wildHeart.enablePoulticeRecipe()>><</silently>>''<div class="hub-textbox">
A small, frail-looking woman enters the tent with an unhurried, almost casual stride.
Old Morag.
She gives the wildling one look, then you another, and lets out a dry little sound that might be amusement.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Livelier than yesterday,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">Good. That means the spirits have not finished fighting over her yet.</span>
</div>
The wildling does not seem to appreciate this verdict. She tenses at once, ready to resist even now.
Morag waves two fingers in her direction.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Hold her still.</span>
</div>
You do.
There is struggle, of course. The wildling twists and nearly slips free once, but in the end Morag presses a palm to her brow, studies her eyes, and listens to her breathing with the calm patience of someone examining bad weather.
At last the old woman straightens and grunts.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Not a simple wound-fever. Something clings to her.</span>
</div>
She explains, in the matter-of-fact tone she uses for births, deaths, and everything in between, that she may still be able to drive it out.
For now, though, there is nothing more to be done inside this tent tonight.
When she leaves, the wildling sags back onto the furs, breathing hard but still watching you with the same stubborn fire in her eyes.
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">Still Water Roots</span>
</div>
<div class="result-line good">
<span class="label">Recipe unlocked</span>
<span class="value">Wildling Poultice</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the tent for now</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set $questFlags.q_wildling_bath_intro = true>>
<</silently>>''<div class="hub-textbox">
Morag stops you near the edge of camp while you are giving instructions to one of the women on how to prepare cloth for winter. A moment later, you feel a stick strike your shin. Turning, you find Morag casually jabbing you to get your attention.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">The girl is healing,</span>
<span class="dialogue-bridge">She says, jerking her chin toward the wildling’s tent.</span>
<span class="dialogue-line">But... ugh, for spirits’ sake, the girl needs a bath! She smells like a bog-rotten hide, and she barely even lets me approach her!</span>
</div>
She sighs and clicks her teeth.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">So, Chieftain, take care of it. I’m already losing my sight. I don’t need to lose my sense of smell as well. That’s how I tell the herbs apart.</span>
</div>
She says it while already turning to head elsewhere.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">Besides, you’re the only one who seems able to understand her gibberish anyway. Maybe you can even explain to her that she smells like an old carcass wrapped in moss!</span>
</div>
With that, she stomps off, clearly expecting you to deal with it.
For your part, you decide to see the problem for yourself once you are finished.
Up close, the smell is worse than before. It is no longer just the rank stench of someone half-dead from fever, but old sweat, matted filth, and the sour edge of wounds left too long without proper cleaning. Beneath the layers of grime, several scratches along her arms and side have reddened and swollen.
Even you cannot help but wrinkle your nose. You are not sure whether your heightened senses make it better or worse.
She glances at you as you enter, only mildly interested, and continues carving something into the floor with one of the knives she seems to have snatched from your hunters.
You approach her casually, take the knife from her hand, and then, with your other hand, point toward the tent flap. She understands you perfectly despite her lack of language, in that strange way she seems able to understand only you.
Outside. Bath. Now.
At the word, the wildling goes rigid.
Her head snaps first toward Morag, then back to you. Her breathing quickens. When you gesture gently toward the spring outside camp, panic flashes across her face so naked and immediate that it jars you more than any snarl ever has.
She backs away at once, eyes wide, as though the very thought of deep water is worse than pain.
Morag watches her for a moment, then sighs.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">There’s something there,</span>
<span class="dialogue-bridge">The old woman mutters.</span>
<span class="dialogue-line">Maybe memory. Maybe fear. Doesn’t matter. She still needs it done.</span>
</div>
That much is clear enough.
Getting her to the spring without turning the whole thing into another struggle will be the hard part.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Force the issue</span>">>
<<goto "Event_Major_WildlingBath_Force">>
<</button>>
<<button "<span class='choice-text'>Try being patient</span>">>
<<goto "Event_Major_WildlingBath_Patient">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<run setup.wildlingRoute.applyBathForce()>>
<</silently>>''<div class="hub-textbox">
You dont have time for this. at least not any you are willing to spare. You go towards her, and grab her, perhaps a bit roughly, before throwing her over your shoulder and carrying her to the spring.
You rip off her clothes when you get there
<<nsfwimgnew "images/events/bath/ne3.png">>
You enter the water while holding her naked body as you begin to clean her
<<nsfwimgnew "images/events/bath/ne1.png">>
She goes rigid the moment the warmth touches her skin. Her legs kick weakly, more out of principle than any real attempt to escape. You hold her firm against your chest with one arm while the other works Morag's herbal paste across her body.
The grime comes away in dark clouds. You scrub her arms first, then her ribs, then the infected scratches along her side that have gone too long without care. She makes sharp sounds of protest when your fingers pass over the swollen edges of the wounds. Her body stays tense as a bowstring.
<<nsfwimgnew "images/events/bath/ne5.png">>
You work quickly. No tenderness. No soothing sounds. Just efficient movement, cleaning what needs to be cleaned so the wounds do not fester. Your hand passes between her legs once, twice, removing the accumulated filth there. She jerks at the contact but does not bite again.
When you finish, you release her.
She tears herself from your grip instantly, water churning around her as she puts distance between you. Three long strides backward until her shoulders press against the far rocks. Her chest heaves. Her eyes burn with something too sharp and proud to be called fear.
Fury. Pure and undiluted.
You meet her glare without flinching. Gesture once toward camp. The meaning is clear enough.
Done. Going back.
She does not follow you out of the water. She stays where she is, naked and dripping, watching you retrieve your clothes with the stare of an animal that has been cornered and remembers it.
You sigh, as you dress and then pick her up again.
Morag finds you an hour later and sniffs the air near your shoulder.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">She smells better,</span>
<span class="dialogue-bridge">The old woman says. Her nose wrinkles.</span>
<span class="dialogue-line">You smell like you wrestled a boar into a mud pit.</span>
</div>
You shurg at her statement as you set the wriggling wildling down.
Morag cackles and waves you off toward your next task.
That evening, you catch the wildling watching you. The look she gives you is not friendly. She holds it for a long moment, then turns away and disappears.
Something has shifted between you. The balance is different now. She knows you can force her when you choose. You know she will make you work for every inch of compliance.
<div class="result-list">
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">The wildling is cleaned</span>
</div>
<div class="result-line bad">
<span class="label">Love</span>
<span class="value">-10</span>
</div>
<div class="result-line good">
<span class="label">Obedience</span>
<span class="value">+10</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave her to cool off</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.wildlingRoute.award("bath", "love")>>
<<set _bathEnduranceNeed = 5>>
<<set _bathEndurance = setup.player.getStatForCheck("endurance")>>
<<set _bathEnduranceOk = (_bathEndurance >= _bathEnduranceNeed)>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
…Well, you say patience, but you do not think patience alone will be enough.
So you cross the tent in a few easy steps, and before she can properly react, you catch her and haul her up over your shoulder.
She jerks in surprise, then immediately begins to thrash, twisting and kicking with all the furious strength of a trapped animal. Her fists beat against your back. Her body writhes in your grip. A moment later, sharp pain flashes through your side as she bites you.
<div class="result-list result-list-check">
<div class="result-line <<if _bathEnduranceOk>>good<<else>>bad<</if>>">
<span class="label">Endurance threshold</span>
<span class="value"><<if _bathEnduranceOk>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label">Endurance needed</span>
<span class="value"><<print _bathEnduranceNeed>></span>
</div>
<div class="result-line">
<span class="label">Your Endurance</span>
<span class="value"><<print _bathEndurance>></span>
</div>
</div>
<<if _bathEnduranceOk>>
You barely react. You keep walking as if she has done little more than test you.
<<else>>
You wince hard enough for her to feel it, then give her a firm shake until she lets go. After that, you keep walking.
<</if>>
Ignoring the stares of anyone who notices, you carry her through camp and toward the spring.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Carry her to the spring</span>">>
<<goto "Event_Major_WildlingBath_Patient_1">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<run setup.playStars ? setup.playStars() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "stars";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
When you arrive, you set her down on a broad stone near the water’s edge without ceremony.
For a moment, she looks ready to run.
But then you turn your back on her and begin to undress, as if you do not consider flight a real possibility.
That, more than anything, seems to catch her attention.
You can feel her stare on you as you strip off the last of your clothes. Suspicious. Narrow-eyed. Uncertain. Her gaze travels over your <<if $height < 160>>small<<elseif $height > 220>>humongous<<elseif $height > 190>>large<<else>>normal<</if>> frame, not trusting you enough to relax, but too curious to look away either.
You do not acknowledge it.
Instead, you step into the spring.
One step. Then another.
The water climbs slowly up your legs, then your waist, until half your body is submerged. Ripples spread softly around you as you move deeper, then settle again. At last, you find a place to sit and lower yourself into it with deliberate ease, stretching out as though this had been your purpose all along.
You lean back, tilt your head toward the treeline, and let out a long, exaggerated sigh of relief.
Still, you do not look at her.
You simply sit there in the water, loose and unbothered, leaving the silence to work on her.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Wait and let her watch</span>">>
<<goto "Event_Major_WildlingBath_Patient_2">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (!document.body) return;
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
window.setTimeout(function () {
try {
if (!document.body) return;
document.body.classList.add("wildling-bath-fade");
void document.body.offsetWidth;
window.setTimeout(function () {
try {
if (document.body) document.body.classList.add("wildling-bath-blackout");
} catch (e) {}
}, 40);
} catch (e) {}
}, 40);
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
For a while nothing happens, but still you persist, if thats the right word.
In fact, you come to actually start relaxing as you close your eyes, head still turned upward.
A few moment pass in silence. Then you hear a rustle, and another one. Then silence again. Befoer you finally open your eyes again
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Open your eyes</span>">>
<<goto "Event_Major_WildlingBath_Patient_3">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (!document.body) return;
document.body.classList.add("wildling-bath-fade", "wildling-bath-blackout");
window.setTimeout(function () {
try {
if (document.body) document.body.classList.remove("wildling-bath-blackout");
} catch (e) {}
}, 60);
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
<<cgimg "images/events/bath/look.png" "The Wildling studies you from the spring's edge">>
What you see before you is the wildling crouched above you, knees pressed together, her head tilted as she studies you with open curiosity.
You keep your expression neutral. Then, slowly, you lift one hand from the water and give her a thumbs-up.
You are not entirely sure why you use that gesture. It has no meaning here beyond the one you have just chosen to give it. And yet, as always, the woman seems to understand you perfectly.
Feels good.
You watch the conflict play across her face. Suspicion first, sharp and immediate at your bold, wordless claim. Then a snarl.
The meaning is easy enough to read.
Liar.
You only shrug.
That meaning reaches her even faster.
Coward.
That seems to frustrate her. She suddenly rises and begins making a flurry of sharp hand gestures, mixed with disconnected sounds and annoyed little snarls. You watch, only mildly amused.
Then, suddenly—
She turns toward the water. Befpre quickly tearing off the little clothes she is wearing, imitating what you did earlier.
She takes a deep breath, perhaps without even noticing she has done so, and then rushes forward and throws herself in.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Splash!</span>">>
<<run (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("splash")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(false); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<<goto "Event_Major_WildlingBath_Patient_4">>
<</button>>
</div>''<div class="hub-textbox">
Water covers your eyes for a moment, making you squint. It is only a heartbeat later that she breaks the surface, soaked and gasping, her hands flying wildly as though she has fallen into the deepest part of a fast-moving river.
One of them quickly latches onto you. Eyes squeezed shut, she pulls herself closer, coughing, her naked body pressing against yours. She does not seem to notice or mind it. Instead, she struggles to open her eyes and look at you, then lets out a wordless sound.
Not. Coward.
You smile and raise your hands in surrender. That seems to satisfy her.
Then a moment passes. Then another.
She does not seem to be enjoying the water exactly, but neither does she seem bothered by it now. She simply stays pressed against you. In the end, you sigh and decide to focus on what you brought her here for in the first place.
You pull her suddenly so that she is seated between your legs, then begin washing the grime from her body. Her arms, her armpits, her breasts, even her groin. You expect resistance, but to your surprise there is none. She only stiffens briefly at the sudden movement.
<<nsfwimgnew "images/events/bath/ne7.png">>
It goes on like that for a while. Every so often, she lets out a quiet sigh, seeming to slowly settle into it, perhaps even beginning to enjoy herself.
<<nsfwimgnew "images/events/bath/ne2.png">>
At last, when you feel you have done an adequate job, you let go of her. Stretching, you shift her aside and begin to rise. You should head back to camp. There is still work to be done.
But then you feel something holding you, trying to pull you back down.
You turn and find the wildling girl still looking irritated. She points to herself, then to you, and makes a strange motion.
Now. Me. You.
You look at her with a raised eyebrow, then glance back toward the direction of camp.
In the end, you—
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let her do as she pleases</span>">>
<<goto "Event_Major_WildlingBath_Patient_5">>
<</button>>
<<button "<span class='choice-text'>Get out of the water</span>">>
<<goto "Event_Major_WildlingBath_Patient_Get_Out">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<if not $questFlags.q_wildling_bath_patient_5_done>>
<<set $questFlags.q_wildling_bath_patient_5_done = true>>
<<set $questFlags.q_wildling_bath_done = true>>
<<set $questFlags.q_wildling_bath_memory_unlocked = true>>
<<run (function () {
const w = setup.people && typeof setup.people.upsert === "function"
? setup.people.upsert("npc_wildling", {})
: null;
if (w) w.love = Number(w.love ?? w.trust ?? 0) + 20;
})()>>
<</if>>
<</silently>>''<div class="hub-textbox">
You settle back down into the water.
The wildling makes a satisfied sound, somewhere between a grunt and a huff. Then her hands are on you.
She starts with your shoulders, pressing her palms against the muscle there, pushing and rubbing with more force than finesse. Her technique is rough and practical—the same way she might work a knot out of rope. She does not understand that human skin requires gentleness.
Her fingers dig into your arms next, then slide across your chest. She pauses there, her brow furrowing. Her thumb traces the line between your pectorals, then moves lower, following the groove of muscle down your stomach. Her head tilts. The same curious intensity she shows when examining tracks in the mud.
You watch her face as she works. Her eyes move with her hands, mapping the unfamiliar territory of your body. She has never been this close to a man who was not trying to kill or capture her. The realization settles in your mind alongside the strange warmth of her attention.
Her hands reach your waist. She grips your sides, slides lower along your hips. Her fingers brush the top of your thigh, and you feel your cock twitch under the water in response.
She freezes.
Her gaze drops beneath the surface. The murky water obscures details, but the shape of you is visible enough. Thick. Hard. Rising from between your legs like something she has never seen before, or never seen this close.
She looks back up at your face. Then down again.
Her hand moves before she seems to decide to move it. Her fingers find you under the water, wrapping around your shaft with a grip that is too tight and positioned wrong. She holds your cock like she is holding a stick she found in the forest. Examining its weight. Its girth. The way the veins run along the underside.
You let out a slow breath.
Her eyes snap to your face again. Watching. Processing. She adjusts her grip, loosening it slightly, and your breath changes again. A small observation. She files it away.
Then she moves her hand.
<<nsfwimgnew "images/events/bath/ne6.png">>
It is clumsy. Her stroke is uneven, too fast at first, then too slow. She has no rhythm, no technique. She is simply testing. Seeing what happens when she pulls up, when she pushes down, when she squeezes at the base versus the head. Each variation produces a different response from you. A tensed jaw. A sharp inhale. The way your hands grip the stones beneath the water.
She studies all of it with rapt attention.
The water laps against your bodies as she works. Her naked chest presses against your thigh, her small tits barely visible beneath the surface, nipples hard from the cooler air above the waterline. She does not seem aware of the contact. Her entire focus has narrowed to your cock in her hand and the reactions she can pull from you.
A bead of pre-cum leaks from the tip. Her thumb brushes over it, spreading the slick fluid along the head, and the sensation makes you groan low in your throat.
She stops.
Her thumb rubs over the slick spot again, deliberately this time. More of the fluid leaks out, mixing with the warm water. She tilts her head, examines it, then looks at your face with an expression that asks a question she cannot put into words.
You do not answer with words either. You simply let your head fall back and exhale.
That is answer enough.
She continues. Her grip finds a better angle now, still imperfect but learning. Each stroke pulls a wet sound from the water around you, a soft schlick-schlick that mixes with the steam and the distant call of birds. Her other hand braces against your thigh for leverage, her scarred fingers pressing into the muscle there.
The pressure builds low in your gut. Your balls tighten. She notices the change in your breathing immediately. Her pace quickens, matching the urgency she senses in your body, though she could not name what is coming.
You grip the edge of the stone shelf beneath you and spill into the water.
Your cum clouds the surface between you for a moment before the spring's gentle current carries it away. She watches this with open fascination, her hand still wrapped around your softening cock, her fingers coated in the white fluid.
She lifts her hand above the water. Examines it. Sniffs it once. Then wrinkles her nose and wipes her palm against your chest.
You laugh.
It surprises you both.
She looks at you like you have made a strange animal noise. Then something shifts in her expression. Not a smile. She does not smile. The tension in her shoulders eases, though. Her posture loosens.
You both stay in the water a while longer.
At some point she moves away from you and begins washing herself properly, mimicking the motions you used on her earlier. You watch without staring. When she finishes, she wades toward the edge and climbs out, water streaming down her thin, scarred body. She waits on the stones for you, arms crossed, dripping.
You follow.
The walk back to camp is quiet. She trails behind you at first, then draws alongside, then occasionally moves ahead to scout the path before falling back again. She does this three times before she seems to remember that she does not need to. That nothing here is hunting her.
At the edge of camp, she pauses. Looks at you. Makes a low sound in her throat, then turns and heads toward Morag's area without another glance.
You watch her go.
Something has changed between you. You cannot name it exactly.
But you have touched her now. She has touched you. In the hot water and the steam, something passed between you that required no language.
It is a start.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+20</span>
</div>
<div class="result-line good">
<span class="label">New normal event</span>
<span class="value">Spring Heat</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Head back to camp.</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<if not $questFlags.q_wildling_bath_patient_get_out_done>>
<<set $questFlags.q_wildling_bath_patient_get_out_done = true>>
<<set $questFlags.q_wildling_bath_done = true>>
<<run (function () {
const w = setup.people && typeof setup.people.upsert === "function"
? setup.people.upsert("npc_wildling", {})
: null;
if (w) w.love = Number(w.love ?? w.trust ?? 0) + 10;
})()>>
<</if>>
<</silently>>''<div class="hub-textbox">
You rise from the water.
Behind you, the wildling makes a sound. Sharp. Caught between confusion and protest. Her hand is still extended where it had gripped your arm, fingers curled around nothing.
You turn to face her. Shake your head once. Then gesture toward the direction of camp.
Work. Duty. Later.
She stares at you. Her expression shifts through several stages too quickly to track. The confusion lingers longest. Then something harder settles behind her eyes.
Her hand drops back into the water. She looks away from you, toward the far edge of the spring where the rocks meet the treeline. Her jaw works for a moment, teeth pressing together.
You wade to the shore and climb out. The cool air raises gooseflesh across your skin as water streams from your body. Behind you, you hear her moving as well, the displacement of water as she follows.
Neither of you speak. There is nothing to say.
You dress in silence. She does the same with the scraps of hide she arrived in, tugging them into place with sharp, irritated movements. Her back stays turned to you the entire time.
The walk back to camp stretches longer than the walk out.
You can feel her gaze on your shoulders, heavy with something she cannot name and you have chosen not to address.
At the edge of camp, she breaks away without a sound. Heads toward Morag's area. She doesnt look back.
Morag intercepts you a few minutes later, sniffing the air near your shoulder with an appraising squint.
<div class="dialogue-inset">
<span class="dialogue-speaker">Morag</span>
<span class="dialogue-line">She smells better,</span>
<span class="dialogue-bridge">The old woman allows. Then her eyes narrow further.</span>
<span class="dialogue-line">Something sour about her mood, though. What did you do?</span>
</div>
You tell her nothing happened.
Morag snorts and waves you off, clearly unconvinced but uninterested in pressing further.
In the end, you focus on your other duties. Being Chieftian is busy work after all
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+10</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Back to being chieftain.</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<goto "Event_Major_WildlingFinal_Departure">><<silently>><<set _wildlingFinalRoute = setup.wildlingFinal.beginDeparture()>><</silently>>
<div class="hub-textbox">
<<if _wildlingFinalRoute is "love">>
<p><b>By the time the camp begins to settle for the evening, you have had enough of listening to arguments over food stores, hunting grounds, and whose turn it was to repair a shelter that everyone insists someone else damaged.</b></p>
<p><b>Earlier, while working through some of the tribe's tools, you had complained about the stone available nearby. Too much of it cracked badly when worked, leaving brittle edges and wasted effort. <<print $wildlingName>> had taken one of the discarded flakes from your hand, turned it between her fingers, and made a quiet sound of disapproval before tossing it aside.</b></p>
<p><b>Now, with the day's work mostly done, you find yourself looking for her.</b></p>
<p><b>She is not near your sleeping place, nor at the fire where she sometimes settles when she feels like being around the others. A quick look around the edges of camp turns up nothing either. That is not especially strange by itself. <<print $wildlingName>> has never developed much respect for the idea that people ought to announce where they are going.</b></p>
<p><b>As the light fades, however, you begin asking around.</b></p>
<p><b>One hunter remembers seeing her leave camp earlier, heading into the woods alone. Another thinks she had something wrapped around one shoulder, though he cannot say what. Nobody spoke to her before she went, and nobody seems to know when she intended to return.</b></p>
<p><b>There is no sign of a struggle and no reason to think anyone forced her away. You find her trail without much difficulty at first, but after following it beyond the camp for some distance, the tracks simply vanish among stone, roots, and harder ground. Whether intentionally or not, <<print $wildlingName>> has left you very little to follow.</b></p>
<p><b>Finding her now would be difficult even for you.</b></p>
<p><b>For the moment, all you can do is wait and hope she comes back.</b></p>
<<elseif _wildlingFinalRoute is "obedience">>
<p><b>The day's camp business leaves you with several small problems still waiting to be dealt with, including a growing pile of chipped blades and spearheads made from stone that has proven more trouble than it is worth.</b></p>
<p><b>You had shown some of it to <<print $wildlingName>> earlier. The material flakes poorly, breaking where it should split cleanly, and replacing damaged points is consuming more time than it should. You remarked that better stone would make things easier. She listened, took one of the broken pieces from you, and studied it for a while before giving a small nod.</b></p>
<p><b>Later, when you go looking for her again, she is nowhere to be found.</b></p>
<p><b>At first you assume she has simply moved elsewhere in camp. You check the places she usually favors, then the edge of the firelight, then your own tent. When none of those turn her up, irritation begins to creep in.</b></p>
<p><b>A hunter finally tells you that he saw her leave several hours earlier. She went alone and gave him no explanation. Nobody tried to stop her. <<print $wildlingName>> disappearing into the woods is hardly unusual, and more importantly, most of the tribe regards her as yours. Few are inclined to obstruct her without a very good reason.</b></p>
<p><b>Her trail is easy enough to find once you know where to look. It leads away from camp without hesitation and deeper into the surrounding country, but before long the tracks disappear across harder ground.</b></p>
<p><b>You had not sent her anywhere.</b></p>
<p><b>Whatever she is doing, she decided to do it without waiting for you to tell her.</b></p>
<<else>>
<p><b>It is one of the hunters who eventually brings the matter to your attention.</b></p>
<p><b>He approaches while you are dealing with something else and asks, somewhat uncertainly, whether you sent the Wildling somewhere. The question takes you a moment to understand.</b></p>
<p><b>You did not.</b></p>
<p><b>That leads to a few questions around camp, and those questions produce remarkably little. Someone saw her near the fires the previous evening. Another remembers passing her sometime after that. One of the hunters thinks he saw her moving toward the edge of camp, though he cannot remember whether that was yesterday or the day before.</b></p>
<p><b>Nobody knows exactly when she left.</b></p>
<p><b>When you finally check the places she tends to sleep or linger, there is no sign of her. Nothing appears disturbed, there is no blood, and nobody heard a struggle. A search around the edge of camp eventually turns up a few tracks that can only reasonably be hers, leading away into the woods.</b></p>
<p><b>For a time, even that does not seem particularly alarming. <<print $wildlingName>> has wandered away before, and keeping someone watching her every hour of every day would have served little purpose.</b></p>
<p><b>Then night comes, and she does not return.</b></p>
<p><b>Another passes.</b></p>
<p><b>By the time enough people can be spared to search properly, what little trail there was has faded beneath weather, animals, and the movement of the season. You could send hunters ranging through the surrounding wilderness for weeks and still have no assurance they were even moving in the right direction.</b></p>
<p><b>There is no message and no explanation.</b></p>
<p><b>Perhaps there never needed to be one.</b></p>
<p><b>Whatever existed between you was never quite one thing or another. At times you drew her closer; at others you pushed her into a place she had not chosen. You gave her freedom, then took it away, offered affection, then expected submission. Perhaps, in the end, neither meant enough to keep her here.</b></p>
<p><b>There is little use dwelling on it now.</b></p>
<p><b><<print $wildlingName>> is gone.</b></p>
<</if>>
</div>
<div class="hub-buttons">
<<button "Let her go.">><<run setup.wildlingFinal.finishDeparture()>><<endMajorEvent>><</button>>
</div><<silently>><<set _wildlingFinalRoute = setup.wildlingFinal.beginReturn()>><</silently>>
<div class="hub-textbox">
<<if _wildlingFinalRoute is "love">>
<p><b>By the time <<print $wildlingName>> returns, her absence has lasted long enough that the places she usually occupies have begun to feel conspicuously empty.</b></p>
<p><b>Then a shout rises near the edge of camp.</b></p>
<p><b>You find several tribespeople gathered there, staring as <<print $wildlingName>> walks between them as though she left only that morning. Dust and dried mud mark her legs, her clothes are scuffed from travel, and a heavy hide bundle hangs over one shoulder.</b></p>
<p><b>She spots you and grins.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Found it.</span>
</div>
<p><b>Whatever you had been feeling a moment before is briefly pushed aside by confusion.</b></p>
<p><b>The bundle drops at your feet with a dull series of knocks.</b></p>
<p><b>Inside are chunks of dark, fine-grained stone, far better suited to blades and spearheads than most of what the tribe has been using. One piece has already been broken along a clean edge, enough to show the difference immediately.</b></p>
<p><b>You look back at her, not quite sure what to make of it.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Good stone.</span>
</div>
<p><b>She says it matter-of-factly, then seems vaguely dissatisfied with your reaction.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">You said ours was bad.</span>
</div>
<p><b>It takes you a moment, but then it clicks.</b></p>
<p><b>You had complained to her about the quality of the stone.</b></p>
<p><b>That explains what she brought back.</b></p>
<p><b>It does not explain why she disappeared without telling anyone.</b></p>
<p><b>When you point that out, <<print $wildlingName>>'s expression shifts from pride to confusion.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">I went to get it.</span>
</div>
<p><b>You wait.</b></p>
<p><b>She waits too.</b></p>
<p><b>After a moment, you make it clear that nobody knew where she had gone, or whether she intended to return at all.</b></p>
<p><b>Her brow furrows.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">I knew where it was. Far away. Where I used to hunt when I was alone.</span>
</div>
<p><b>She nudges the bundle with one foot.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Went there. Found it. Came back.</span>
</div>
<p><b>You press the point.</b></p>
<p><b>Did it never occur to her that people might think she had simply left?</b></p>
<p><b>She tilts her head, genuinely considering the question for a moment before answering with complete matter-of-factness.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">No.</span>
</div>
<p><b>She glances around the camp, then back to you.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Why would I?</span>
</div>
<p><b>She points at you.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">You are here.</span>
</div>
<p><b>For <<print $wildlingName>>, there seems to be no contradiction in any of it. She left because there was somewhere she wanted to go. She crossed the wilderness alone because she could, found what she was looking for, and returned when she was finished.</b></p>
<p><b>The wilderness is still hers to wander, and perhaps it always will be.</b></p>
<p><b>The difference is that now, wherever she chooses to go, she has somewhere she chooses to come back to.</b></p>
<div class="result-list">
<div class="result-line good"><span class="label">Trait gained</span><span class="value">Free Spirit</span></div>
<div class="result-line good"><span class="label">Resources gained</span><span class="value">+65</span></div>
</div>
<<else>>
<p><b><<print $wildlingName>> returns without warning.</b></p>
<p><b>You spot her crossing into camp with a hide bundle over one shoulder, moving directly through the scattered shelters without stopping for anyone who calls to her. Dust streaks her legs and arms, and whatever journey she made was long enough to leave her clothes marked by time in the wild.</b></p>
<p><b>She comes straight to you.</b></p>
<p><b>For a moment, you consider how best to discipline her for disappearing without permission.</b></p>
<p><b>Then the bundle lands at your feet.</b></p>
<p><b>Inside are several pieces of dark, fine-grained stone, far better suited to blades and spearheads than most of what the tribe has been working with.</b></p>
<p><b>You recognize the connection almost immediately.</b></p>
<p><b>The broken tools.</b></p>
<p><b>Your complaint about the stone.</b></p>
<p><b><<print $wildlingName>> had listened.</b></p>
<p><b>She watches you inspect one of the pieces.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Better.</span>
</div>
<p><b>You glance up at her.</b></p>
<p><b>She points toward the stone.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">You said ours was bad. You needed good stone.</span>
</div>
<p><b>After a little questioning, the rest becomes clear. She remembered a place near the old camp where better stone could be found and, once the memory returned to her, she went to retrieve it.</b></p>
<p><b>You never ordered her to go.</b></p>
<p><b>When you point that out, she gives a small nod.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">I know.</span>
</div>
<p><b>You ask why she left without telling you.</b></p>
<p><b>This time she hesitates.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">I thought...</span>
</div>
<p><b>She frowns, searching for the words.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">You needed it. I could get it.</span>
</div>
<p><b>For a time she was beyond your sight, beyond the camp, and beyond anyone's ability to compel her to do anything. If she had decided to keep walking, there was little anyone could have done to stop her.</b></p>
<p><b>Instead, she remembered something you needed, crossed the wilderness to find it, and returned carrying it directly to you.</b></p>
<p><b>You make that point clear as well.</b></p>
<p><b>She could have gone anywhere.</b></p>
<p><b><<print $wildlingName>> looks at you as though the observation itself is strange.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">Yes.</span>
</div>
<p><b>Then, after a moment, she gestures down at the bundle.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">But you needed this.</span>
</div>
<p><b>She looks back at you.</b></p>
<div class="dialogue-inset">
<span class="dialogue-speaker"><<print $wildlingName>></span>
<span class="dialogue-line">So I came back.</span>
</div>
<p><b>The fact that she acted without permission is still a problem. That much can be corrected.</b></p>
<p><b>But the reason she acted at all is something else.</b></p>
<p><b>The woman who once fought every expectation placed upon her crossed the wilderness alone, beyond anyone's reach, because of a few throwaway words from you, and decided it was her duty to fulfill them.</b></p>
<p><b>The free-spiritedness can be disciplined out of her.</b></p>
<p><b>That instinct to shape her actions around your needs, though...</b></p>
<p><b>That is something worth cultivating.</b></p>
<div class="result-list">
<div class="result-line good"><span class="label">Trait gained</span><span class="value">Claimed</span></div>
<div class="result-line good"><span class="label">Resources gained</span><span class="value">+65</span></div>
</div>
<</if>>
</div>
<div class="hub-buttons">
<<button "Put what she brought to use.">><<endMajorEvent>><</button>>
</div><<silently>>
<<run setup.wildlingSecondQuest.ensureInitialMode()>>
<<set _mode = $questFlags.q_wildling_second_initial_mode>>
<<set _halona = setup.wildlingSecondQuest.hasHalona()>>
<</silently>>
<div class="hub-textbox">
<<if _mode is "love">>
<p>You sit with the Wildling near the edge of camp, far enough from the busiest fires that the constant noise does not distract her. At least, that was the idea. You point toward the clay bowl sitting between you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“Bowl.”</span></div>
<p>Her eyes move from you to the bowl. Then back to you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“Bowl,” </span></div>
<p>you repeat. She frowns at it as though the object itself has done something wrong. Finally, she tries.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Bol.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“Bowl.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Bol.”</span></div>
<p>You shake your head. Her frown deepens.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“Bowl.”</span></div>
<p>She stares at your mouth this time, watching the movement carefully.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Bo...wl.”</span></div>
<p>Closer. You nod. A pleased little smile immediately pulls at one corner of her mouth. Then she points at the bowl.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Bol.”</span></div>
<p>You sigh as her smile widens. You are beginning to suspect that last one was deliberate. Teaching her has proven... interesting. Not difficult, exactly. She learns quickly when something catches her attention, yet agonizingly slowly when she realizes a mistake bothers you. The greater problem is that neither of you actually needs this. When she slips back into the strange scraps of speech, noises, gestures and expressions that come naturally to her, you understand almost without thinking. Sometimes better than when she tries to use your language. The rest of your tribe are not so fortunate.</p>
<p>To them, a sharp sound and a gesture toward the trees remain exactly that. So you point at the bowl again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“Bowl.”</span></div>
<p>She rolls her eyes. Then, with exaggerated care:</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Bowl.”</span></div>
<p>You nod approvingly. That earns you another pleased look. Annoyed by the smug look on her face, you reach for something else to torment her with. Ideally something difficult to pronounce.</p>
<<if _halona>>
<p>A shadow falls across the ground beside you. You glance up. Halona has stopped a short distance away. Her attention is not on you at first. It rests on the Wildling. Then on the bowl between you. Then on the way the Wildling is sitting close enough that her knee nearly touches yours. For a moment, Halona says nothing. She simply looks at you, arms crossed. The Wildling notices her too. She looks from Halona to you, apparently sensing something without having the faintest idea what it is. Halona's eyes return to yours.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“There is a problem.”</span></div>
<p>The words come quickly. Clipped. Her displeasure barely hidden. A hunting party should have returned some time ago. Only one of them has made it back, injured and without the others. You start to ask what happened.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“He can tell you.”</span></div>
<p>She is already walking away. After only a pace, she stops. Her eyes flick briefly toward the Wildling again. Then back to you. The look she gives you is sharp enough that, for a moment, you wonder whether answering would be wise.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“I thought you would want to know.”</span></div>
<p>Then she turns and leaves. The Wildling watches her go. A moment later, she looks back at you with her head tilted. A questioning sound. You decide not to explain.</p>
<<else>>
<p>One of the hunters approaches before you can continue the lesson.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Chief.”</span></div>
<p>Something in his expression makes you forget the bowl.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“A hunting party was supposed to return earlier. One of them just came back.”</span></div>
<p>You rise, asking if he means alone. The hunter nods.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“And hurt. The others are still out there.”</span></div>
<</if>>
<p>Whatever lesson you had planned is going to have to wait. You get to your feet. The Wildling does the same. By the time you take your first step, she is already falling in behind you. You stop and look back. She points toward herself. Then toward you. A few quick sounds follow, natural and effortless. The meaning reaches you immediately. She wants to come. Then, perhaps remembering the lesson, she tries again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“Me... go.”</span></div>
<p>The mangled words tell you less than the gesture did. Still. The intent is clear. She wants to come with you.</p>
<<else>>
<<if _halona>>
<p>You hear Halona before you see her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“No. Again.”</span></div>
<p>You round the side of the shelter. Halona is sitting opposite the Wildling, a collection of small objects scattered between them. She holds up a stone.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“Stone.”</span></div>
<p>The Wildling repeats the word. Almost correctly. Halona shakes her head.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“Stone.”</span></div>
<p>Another attempt. Better. Halona notices you approaching and gives you a small nod.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“She is getting it.”</span></div>
<p>The Wildling looks toward you, then back to the stone. Halona turns it between her fingers.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“Your language is not particularly difficult.”</span></div>
<p>You raise an eyebrow. Halona's mouth curls slightly.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“I had to learn it too, remember?”</span></div>
<p>She holds the stone up again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Halona</span><span class="dialogue-line">“It mostly becomes easier once you accept that half the words sound like someone trying to speak with food in their mouth.”</span></div>
<p>The Wildling makes a short sound. If you did not know better, you would say it was amusement. Halona glances at her. The two share a look. Apparently you have been discussed. You decide, for the moment, not to ask how much. The lessons seem to be working. That is what matters. You have never needed the Wildling to speak your people's tongue yourself. You understand her well enough already, sometimes more clearly when she stops trying to force unfamiliar words into her mouth. But the rest of the camp cannot. If she is going to live here, that needs to change. Halona sets the stone down.</p>
<<else>>
<p>You find the Wildling seated across from Morag. Neither looks particularly happy. Morag points toward a bundle of dried herbs.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“Herbs.”</span></div>
<p>The Wildling stares at her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“Herbs.”</span></div>
<p>Silence. Morag points again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“Herbs.”</span></div>
<p>The Wildling finally makes a sound that is not even remotely the same word. Morag closes her eyes. For just a moment. Then opens them again. She seems calm. Then— Thump. The sound of a stick striking a head.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“You stupid girl! I've had brats still suckling their mothers' teats who could have said it better than that!”</span></div>
<p>She huffs, glaring down at the Wildling.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“You think you're clever, hm? I see that look in your eye. You... you...!”</span></div>
<p>She trails off into an irritated sigh. Slowly, she lowers herself back down, her old bones making the simple motion more of a struggle than she would ever admit.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“Again.”</span></div>
<p>You almost smile. The arrangement has been useful. You have never needed the Wildling to speak your tribe's language. Whatever strange quirk of your nature allows you to understand distant tongues has worked just as easily with her. The rest of your people do not share that gift. If she is going to live among them, she needs to understand them. And they need to understand her. Morag notices you first.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“She learns quickly.”</span></div>
<p>The Wildling looks over. Morag pauses. Her mouth twists, annoyed by her own admission.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“When she feels like it.”</span></div>
<p>Then she looks at you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Morag</span><span class="dialogue-line">“Why am I in charge of taking care of your pet projects anyway?”</span></div>
<p>The Wildling's expression makes it quite clear she understood that much.</p>
<</if>>
<p>Before the lesson can continue, someone calls for you from outside. A hunter is waiting. One of three who left camp earlier. Only one who returned. Judging by the blood dried along his side, the journey back was not an easy one. The other two are still missing. You look back toward the Wildling. Her attention has sharpened. She may not understand every word yet. But she understands what your look means by now well enough. You tell the waiting hunter to give you a moment. Then you glance back at her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“You're coming with me.”</span></div>
<p>Her eyes narrow slightly. For a heartbeat, she simply watches you. There was a time when that look would have been followed by resistance. Now she simply rises. No argument. No attempt to remain behind. She falls in beside you.</p>
<</if>>
</div>
<div class="hub-buttons">
<<button "Continue">><<goto "Event_Major_WildlingSecondQuest_2">><</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<run setup.wildlingSecondQuest.ensureInitialMode()>>
<<set _mode = $questFlags.q_wildling_second_initial_mode>>
<<if $wildlingNameDraft is undefined or String($wildlingNameDraft ?? "").trim() is "">><<set $wildlingNameDraft = "Nara">><</if>>
<</silently>>
<<if !$questFlags.q_wildling_second_name_set>>
<div class="hub-textbox">
<p>You find the returned hunter near one of the central fires. It seems someone has already seen to the worst of his injuries. A strip of hide has been bound tightly around his side, darkened where blood has soaked through. Scratches run across one arm and cheek, but he is standing. Barely. The moment he sees you, some of the tension leaves his shoulders.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Chief.”</span></div>
<p>You ask what happened. He takes a moment before answering.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“We were following a wounded buck. Big one. Took a spear badly, but it kept running.”</span></div>
<p>He gestures vaguely toward the woods.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Went farther than we meant to. Ground gets strange out there. Stone everywhere. Cuts in the earth.”</span></div>
<p>A ravine, perhaps, you think to yourself. Or one of the rocky hollows scattered through the deeper forest.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“We should've turned back.”</span></div>
<p>His jaw tightens as he gives a little shake of his head.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“But Dagan saw the blood. Said it couldn't have gone much farther.”</span></div>
<p>Apparently it could. The hunter wipes a hand across his mouth.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“We found... something.”</span></div>
<p>You wait.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Not sure what.”</span></div>
<p>That earns him a look, and he shifts uncomfortably.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Things. Under an overhang. Dried meat. Hides. A few tools.”</span></div>
<p>A cache? Not abandoned, necessarily. The distinction seems not to have occurred to him at the time. He continues</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Dagan started looking through it. I told him we should leave it alone.”</span></div>
<p>A pause.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“He didn't.”</span></div>
<p>Of course. Behind you, the Wildling makes a short sound. It isn't quite the language she's been learning, but you understand the meaning easily enough. 'Idiot.' The hunter glances toward her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“What?”</span></div>
<p>You decide not to translate and urge him to continue.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Then something moved above us.”</span></div>
<p>His expression changes. Not fear exactly. Confusion, as though he has trouble trusting his own memory of it.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Couldn't see what. Stones came down. Dagan shouted. Then everyone started running.”</span></div>
<p>You ask about the others. The hunter shakes his head.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I lost sight of them.”</span></div>
<p>He touches the bandage around his side.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Something caught me on the way out. Antler, branch... I don't know.”</span></div>
<p>Not particularly reassuring.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I waited.”</span></div>
<p>His gaze drops.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Called for them.”</span></div>
<p>Nothing.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“When it started getting late, I came back.”</span></div>
<p>You ask whether he can find the place again. His answer comes immediately, almost too quickly.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Yes, Chief. I can take you there.”</span></div>
<p>Good. You tell him to rest. He nods, then notices the Wildling properly for the first time. His eyes move over her. Then toward you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“She coming?”</span></div>
<p>You confirm that she is. The hunter hesitates.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“What do I call her?”</span></div>
<p>The question catches you off guard. You glance toward the Wildling. For months, nobody has needed anything more complicated than Wildling. It was her name. Or at the very least, that's what everyone saw when looking at her. The Wildling looks between the two of you. She understands that she is being discussed, even if the words themselves are still imperfect. Perhaps it is time that changed.</p>
<<if _mode is "love">>
<p>You crouch slightly so that you have her attention. Then you explain. A name. Something the others can call her. Something that means her, and nobody else. Understanding comes quickly. She points toward you first.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Wildling</span><span class="dialogue-line">“$user.”</span></div>
<p>You immediately shake your head. No. That's your name. She looks distinctly displeased by this arbitrary rule. You offer another possibility. She considers it. Her nose wrinkles. Apparently not. Another. She repeats the sound quietly, testing it. Then shakes her head. You try again. You offer another name.</p>
<<else>>
<p>You look her over for a moment. A name would make things simpler. For everyone. You decide what she will be called.</p>
<</if>>
<div class="wildling-name-entry"><<textbox "$wildlingNameDraft" "Nara">></div>
</div>
<div class="hub-buttons">
<<button "Give her a name">>
<<run setup.wildlingSecondQuest.assignName($wildlingNameDraft)>>
<<goto "Event_Major_WildlingSecondQuest_2">>
<</button>>
</div>
<<else>>
<<silently>><<run setup.wildlingSecondQuest.createQuest()>><</silently>>
<div class="hub-textbox">
<<if _mode is "love">>
<p>At this attempt, she goes still. She repeats the name once. Then again. Her expression changes. Not dramatically, but a confident smile now tugs at her face. She points toward herself.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“<<print $wildlingName>>.”</span></div>
<p>You smile. She says it once more, a little more confidently. Whatever uncertainty she had seems gone. She has a name now.</p>
<<else>>
<p>You give her the name.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“<<print $wildlingName>>.”</span></div>
<p>She tilts her head. You point toward her. You repeat it. Understanding settles in. Her eyes narrow slightly as she turns the unfamiliar sound over in her mind. Then she touches a hand to her chest.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“<<print $wildlingName>>.”</span></div>
<p>You nod. That is her name now. Whatever she thinks of the development, she appears to have accepted it. For now.</p>
<</if>>
<p>The hunter tries it.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“<<print $wildlingName>> then?”</span></div>
<p>Her head snaps toward him. That alone seems answer enough. The hunter gives a small, uncertain nod.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Right.”</span></div>
<p>For the first time, someone other than you has called her something that belongs only to her. She watches him for another moment. Then looks back at you. The hollow can wait no longer. You know where it is, if not much more yet. But now, at least, the woman coming with you has a name.</p>
<div class="result-list"><div class="result-line good"><span class="label">New Task added</span><span class="value">The Missing Hunters</span></div></div>
</div>
<div class="hub-buttons">
<<button "Head for the hollow.">><<endMajorEvent>><</button>>
</div>
<</if>><<silently>>
<<set _quest = setup.traditionEvents.startYearlyFeastQuest()>>
<</silently>>
''<div class="hub-textbox">
<div><b>The Yearly Feast</b></div><br>
Word has begun to spread through the camp of a great yearly celebration.
Hunters boast that the people should eat until their bellies ache. Gatherers speak of baskets piled high enough to shame leaner seasons. Even the elders approve, saying that a tribe with full stores should not merely endure the year, but celebrate its prosperity.
Still, such a feast cannot be held on hopes alone. If your people are to gather in true abundance when the time comes, the camp will need food enough to spare.
<div class="result-list">
<div class="result-line good">
<span class="label">Task added</span>
<span class="value">Prepare the Yearly Feast</span>
</div>
<div class="result-line">
<span class="label">Objective</span>
<span class="value">Gather <<print _quest.foodRequirement>> Food within 15 turns.</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "You are starting to feel peckish...">><<endMajorEvent>><</button>>
</div><<silently>>
<<set $outcastSpecialTurn = $turn>>
/* Grab the selected major event */
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* Safety */
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
<</silently>>
''<div class="hub-textbox">
<p>You return from the hunt with the forest still humming in your bones. Blood has dried on stone, your breathing has settled, and the woods have fallen back into their old, watchful quiet.</p>
<p>Then something crashes through the undergrowth ahead.</p>
<p>The movement is careless and panicked. Branches snap. Leaves scatter. A woman stumbles into the clearing.</p>
<p>She is young, and striking even in this state. Dark hair hangs tangled with sweat and leaves, while tribal markings show through torn hides. One hand is clamped to her side, her fingers slick with blood. Every breath comes short and painful.</p>
<p>The instant she sees you and your hunters, instinct takes over. She plants her feet and squares her shoulders despite the tremor running through her body. Her eyes burn with defiance, ready to fight even as her knees threaten to fail beneath her.</p>
<p>Her gaze fixes on you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Wounded Stranger</span><span class="dialogue-line">“Stay back.”</span></div>
<p>She spits the words in a language none of your hunters know.</p>
<p>A few of them exchange puzzled looks. One tilts his head, listening for meaning that is not there. Another adjusts his grip on his spear, wary but uncertain.</p>
<p>The words should mean nothing to you either.</p>
<p>Instead, their meaning settles into your mind without effort. It is immediate and unmistakable. You do not translate the language or recall learning it. You simply understand, as though the meaning had been waiting somewhere inside you all along.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Wounded Stranger</span><span class="dialogue-line">“I won't...”</span></div>
<p>Whatever she means to say dies with her strength. Her legs fold beneath her, first one knee and then the other. One palm slams into the dirt as she tries to keep herself upright. A harsh breath tears from her throat, and her head bows beneath the curtain of her hair.</p>
<<cgimg "images/events/Outcast/Outcast.png" alt="Amogus">>
<p>Your hunters murmur behind you. They are not afraid of one wounded woman. They simply do not know what to make of her.</p>
<p>She raises her head again. Her jaw is clenched tightly enough to tremble. Pride holds for another moment before desperation finally wins.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Wounded Stranger</span><span class="dialogue-line">“Please...”</span></div>
<p>The word barely carries beyond her lips.</p>
<p>None of your hunters react. To them, it is still only an unfamiliar sound.</p>
<p>You understand it perfectly.</p>
<p>The men wait for your command.</p>
</div>''
<div class="hub-buttons">
<<button "Help her">>
<<set $outcastIntroChoice = "help">>
<<goto "Event_meeting_outcome_help">>
<</button>>
<<button "Leave her">>
<<set $outcastIntroChoice = "leave">>
<<goto "Event_meeting_outcome_leave">>
<</button>>
</div><div class="event-screen-shell">
<div class="event-screen-head">
<div class="event-screen-kicker">Council Fire</div>
<h2 class="event-screen-title">The Camp Brings Matters Before You</h2>
<p class="event-screen-intro">Whispers, quarrels, and omens gather at the fire's edge...Its your duty as chieftain to hear them out.</p>
</div>
<<eventList>>
</div><<silently>>
<<set _roll = random(1,20)>>
<<set _dc = 8>>
<<set _stat = setup.player.getStatForCheck("wisdom")>>
<<set _label = "Wisdom">>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
/* Power option: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<</silently>>
''<div class="hub-textbox">
You crouch down, your fingers tracing the edge of a print. The earth is cool and damp. With the focus of a seasoned hunter, you begin to follow the trail.
<<if _success>>
Your hunter's eyes, honed by seasons of tracking, follow the faint impressions. The tracks are light, many, and hurried.
They lead you away from the main paths, through a thicket of thorns, and down to a hidden hollow where a small fire flickers. Huddled around it are a handful of women.
There is a stark, fragile beauty to them. Fine cheekbones and wide eyes that seem too large for their gaunt faces. They are a tribe, but a fragile one, barely clinging to the wilds, their expressions a mixture of fear and defiance.
<<else>>
You follow the prints for a short while, but the ground grows too rocky, the trail too faint. The light fails completely, and you are left with nothing but the growing cold and the sense of a mystery unsolved. With a frustrated sigh, you turn back toward camp, the rabbits on your shoulder suddenly feeling much lighter.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Investigation</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Investigation</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<if _success>>
<<button "Take what you want">>
<<set $whispersChoice = "take">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<button "Offer them to join your tribe">>
<<set $whispersChoice = "join">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<if _canSway>>
<<button "Use Sway — Calm them (Sway: <<print _swayCost>> Belief)">>
<<set $whispersChoice = "sway">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<else>>
<span class="macro-button disabled"
title="<<print _hasSway ? ('Need ' + _swayCost + ' Belief.') : 'You have not acquired Sway.'>>"> Use Sway — Calm them (Sway: <<print _swayCost>> Belief)
</span>
<</if>>
<<else>>
<<button "Return to camp">>
<<endMajorEvent>>
<</button>>
<</if>>
</div><<silently>>
<<set _dc = 12>>
/* Power: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<</silently>>
''<div class="hub-textbox">
<<if $whispersChoice is "take">>
<<silently>>
/* DC override for TAKE path */
<<set _dc = 6>>
<<set _label = "Endurance">>
<<set _stat = setup.player.getStatForCheck("endurance")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<</silently>>
<<if _success>>
A sharp crack echoes as a stone rebounds from your skull, thrown by a pair of trembling hands. You don't flinch, merely staring down with the cold indifference of a predator until the woman shrinks back, freezing in place.
The silence reigns, heavy and suffocating. You drop your catch with a wet thud, the sound like a gunshot in the quiet.
Your arms cross over your chest, emphasizing the sheer bulk of muscle that towers over them, stripping away any illusion of hope for resistance. A single finger points to the dirt at your feet, then shifts to the woman with the most ample hips, a command that requires no words.
She understands immediately. She crawls forward, lower lip quivering, and loosens the furs at your waist with clumsy haste. Your length springs free, thick and imposing, and she takes it into her mouth without hesitation
<<nsfwimgnew "images/events/hidden_tribe/hidden_take.png">>
The heat is sudden and wet, her tongue working along the shaft in a desperate bid for survival and favor. You stand rigid, accepting this primal tribute while the others watch with wide, terrified eyes, the lesson cementing itself in their minds.
Once you have spilled your seed down her throat, securing your dominance, you right your clothes and loom over them. With a sharp gesture, you herd the trembling group out of the hollow.
They follow behind you like sheep, their fate sealed as they are led toward the fires of your camp to serve as your personal concubines. It is good to be chieftain.
<<set $pops += 5>>
<<else>>
Instead, the tension snaps. Something small and hard—a stone—whistles through the air and strikes your forehead.
There's no pain, only a sharp shock, and your eyes clamp shut by pure reflex. In that single, black moment, the hollow erupts in a flurry of panicked motion.
By the time you blink them open again, they are gone. They have scattered into the wilds, a desperate whisper of movement through the undergrowth. You are left standing alone in the hollow, the fire sputtering uselessly still.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Endurance check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Endurance check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<<if _success>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<</if>>
</div>
<<elseif $whispersChoice is "join">>
<<silently>>
<<set _dc = 14>>
<<set _label = "Charisma">>
<<set _stat = setup.player.getStatForCheck("charisma")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<</silently>>
<<if _success>>
You don't approach them as a conqueror, but as an offer of sanctuary. Your voice is low and steady, a calm balm on their frayed nerves. You speak not of strength, but of shared fires. Not of rule, but of protection. You paint a picture not of submission, but of survival, of a future where their children won't have to huddle in the cold, their bellies empty.
The defiance in their eyes doesn't vanish, but it is slowly joined by something new: a flicker of desperate, terrifying hope. A silent conversation passes between them, a series of glances that weigh the certainty of slow starvation against the terrifying uncertainty of trust.
Finally, the eldest among them, her face a map of hardship, gives a slow, deliberate nod. It is an acceptance, fragile as a new leaf in a storm.
Your tribe grows, not by the sword, but by the outstretched hand.
<<set $pops += 5>>
<<set $stability += 5>>
<<else>>
You open your mouth to speak, intending to extend an offer of sanctuary, of shared strength. But before a single word can form, the eldest woman gives a sharp, cutting gesture with her hand. It is a signal, silent and unmistakable.
The hollow erupts. It is not a retreat, but a vanishing. One moment they are a huddled group of wide eyes and defiant faces; the next, they are a chaos of snapping twigs and rustling leaves, disappearing into the dense undergrowth with a desperate speed that takes you by surprise. Your offer of alliance dies on your tongue, unheard and unconsidered.
You are left standing alone by the sputtering fire, the echoes of their flight already fading into the deep woods. The only thing you have gained is the silence of an empty clearing.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Charisma check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Charisma check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<<if _success>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+5</span>
</div>
<</if>>
</div>
<<elseif $whispersChoice is "sway">>
<<silently>>
<<set $belief = Math.max(0, Number($belief ?? 0) - _swayCost)>>
<</silently>>
You do not threaten or raise your voice. Instead, you lower yourself to one knee, drawing level with them, and lock eyes with the woman closest to you.
You project your will outward, a silent, psychic nudge that bypasses reason to whisper directly to the primitive parts of their brains. It is a warm, heavy fog of suggestion that makes the idea of submission feel like their own sudden, wonderful epiphany.
The shift is subtle but instantaneous. The tension drains from their posture, replaced by a languid looseness.
Their pupils dilate, and the hunted look in their eyes softens into something glassy and inviting. You reach out to brush a stray hair from the leader's cheek, and she leans into your touch, sighing as if she has been waiting for it all her life.
Driven by this implanted hunger, two of them slip forward, hands moving with practiced eagerness to untie your furs. Your cock springs free, and they descend upon it together, a tangle of wet tongues and soft lips working in tandem to worship your shaft. They look up at you with pure, diluted adoration, their pleasure derived entirely from serving your length, drowning out the world around them.
<<nsfwimgnew "images/events/hidden_tribe/hidden_sway.png">>
Once you have spent yourself down their eager throats, marking the seal of your control, they wipe their mouths and rise as one. Their fear is forgotten, replaced by vacant, welcoming smiles that promise total obedience.
<<set $pops += 5>>
<<set $stability += 3>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power used</span>
<span class="value">SWAY</span>
</div>
<div class="result-line">
<span class="label">Belief spent</span>
<span class="value">-<<print _swayCost>></span>
</div>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+3</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Bring them home.">>
<<unset $whispersChoice>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Optional: mark when tutorial narrative starts (safe even if unused) */
<<set $tutorialSpecialTurn = $turn>>
<</silently>>
''<div class="hub-textbox">
<p>After a couple of months, you and your tribe have finally begun to settle into this new home. Comfort has been slower to follow. The shelters stand, the fires burn, and the children have begun to laugh again, but the land has tested you at every step.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">$user... we’ve got a problem.</span>
</div>
<p>You turn toward the voice even before you see its owner. Kael approaches, broad-shouldered and fair-haired, his beard thick and untamed. He is built like a bear and nearly as imposing, yet his eyes hold a patience and awareness that do not quite fit his age.</p>
<p>Once, he was the chieftain’s son, a boy more interested in wandering the woods and pestering hunters than learning their craft. That did not last. As he grew, strength was followed by skill, and skill by the kind of dependability others came to rely on.</p>
<p>When his father died, Kael was the first to stand before the tribe and name you as chieftain. Since then, he has been your most loyal aide and your sharpest hunter. Whether he would say it aloud or not, he considers you a friend.</p>
<p>Today, the set of his jaw tells you this is no small matter.</p> <div class="hub-buttons">
<<button "What is it?">>
<<goto "Event_Tutorial_1">>
<</button>>
</div>
</div>''<<silently>>
/* Safety */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
/* Add Kael to camp NPC list (once; widget prevents dupes) */
<<run setup.campNpcs.addKael()>>
/* NEW: When Kael is added, raise his Trust + Obedience to 80 */
<<run (function () {
try { setup.people.syncCampNpcsToPeople(); } catch (e) {}
const k = setup.people.upsert("npc_kael", {});
if (!k) return;
k.trust = Math.max(Number(k.trust ?? 0), 80);
k.obedience = Math.max(Number(k.obedience ?? 0), 80);
})();>>
/* Start the relocation quest (adjacent marker like Outcast chain) */
<<addQuestAdjacentToCamp
"q_tutorial_migration_01"
"Relocate the Tribe"
"Kael has found a richer region nearby—but smoke in the distance suggests others may already be close."
"Choose Relocate Camp in Season Plan, then move to the marked location during Migration."
""
>>
/* Optional: highlight it */
<<set $trackedQuestId = "q_tutorial_migration_01">>
<<run setup.prologue && setup.prologue.beginRelocationGate ? setup.prologue.beginRelocationGate() : null>>
<</silently>>
''<div class="hub-textbox">
Kael exhales through his nose, then gestures vaguely toward the treeline beyond the camp.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">The game here is thinning. We can live off what’s left for another season or two, but only just.</span>
</div>
He scratches at his beard, thoughtful.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I scouted a richer region about half a day’s walk from here. Plenty of sign, and water too. If we wait, others will notice it as well.</span>
</div>
His gaze returns to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We should move sooner rather than later.</span>
</div>
You nod and turn back to what you were doing, at least for the moment. Kael does not leave. When you glance up again with one brow raised, you can already guess there is more to this than dwindling game.
He lowers his voice slightly before continuing.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">While we were scouting, we saw smoke.</span>
</div>
He pauses, watching your reaction.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We didn’t approach, but from what we could tell, they’re close enough to be a potential problem</span>
</div>
Before he can say more, something tugs sharply at his hide-wrap. A small boy has latched onto him with both hands, fair-haired and carrying the same eyes and stubborn set to his jaw.
Kael looks down. For a moment, some of the sternness leaves his face.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Aedan. I’m speaking with the chieftain.</span>
</div>
The boy refuses to let go.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Aedan</span>
<span class="dialogue-line">But Da—</span>
</div>
<div class="dialogue-inset">
<span class="dialogue-speaker">Aedan</span>
<span class="dialogue-line">Cian and Cormac are fighting again! Ma said to fetch the chieftain to stop it!</span>
</div>
He delivers the message proudly, as though he has been entrusted with a task of enormous importance. Kael sighs. You are smiling by now, whether from fondness or quiet amusement.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">My apologies, $user. I’ll deal with it. You needn’t trouble yourself.</span>
</div>
He hesitates before adding one last thing.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">If you want to continue this later, you’ll find me in my tent.</span>
</div>
With that, he turns and leaves with Aedan in tow, while the question of whether to move settles squarely into your hands.
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Relocate the Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Prepare to move.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Safety */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Ensure Kael is present, has Right Hand, and becomes Second on the normal tutorial path. */
<<run (function () {
try { setup.campNpcs?.addKael?.(); } catch (e) {}
try { setup.people?.syncCampNpcsToPeople?.(); } catch (e) {}
try { setup.people?.ensureKaelRightHand?.(); } catch (e) {}
try {
setup.campPositions?.ensureState?.();
const currentSecond = setup.campPositions?.getAssignedNpcId?.("second") || "";
if (!currentSecond || currentSecond === "npc_kael") {
setup.campPositions.assign("second", "npc_kael");
}
} catch (e) {}
})();>>
/* Find the migration quest and repurpose it */
<<set _qid = "q_tutorial_migration_01">>
<<set _qIndex = -1>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "Deal with the Unknown Tribe">>
<<set $quests[_qIndex].desc = "Kael has found signs of another tribe nearby—smoke, tracks, and hunger. They are weak, but not harmless.">>
<<set $quests[_qIndex].objective = "Use Expedition to decide how to handle the tribe (drive off, trade, or absorb).">>
/* Expedition happens from your current camp tile */
<<set $quests[_qIndex].expeditionPassage = "Quest_Tutorial">>
/* Optional but recommended: no longer a “map marker” quest */
<<set $quests[_qIndex].markerRevealed = false>>
/* Keep it active */
<<set $quests[_qIndex].status = "active">>
<</if>>
/* Optional: highlight it */
<<set $trackedQuestId = _qid>>
<<run setup.prologue && setup.prologue.beginExpeditionGate ? setup.prologue.beginExpeditionGate() : null>>
<</silently>>
''<div class="hub-textbox">
By the time the last shelter is raised and the fires settle into a steady burn, the long journey has finally loosened its grip on you. For the first time in days, there is a chance to breathe, though it does not last long.
Kael approaches, offers a brief nod, and gets straight to the point.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">The perimeter is secure. No predators, and no other tribes near enough to stumble into camp. At least, not by accident.</span>
</div>
His voice lowers as he moves on to the part that actually concerns him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">While the others were settling in, I followed the signs we saw before. The smoke.</span>
</div>
His eyes meet yours.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I found them. They’re a small tribe, smaller than us, hungry and weak, but I still woulnd’t just leave them be.</span>
</div>
Kael folds his arms.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">When you’re ready, you can lead an expedition. Meet them, drive them off, trade with them, or convince them to join us.</span>
</div>
He gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">How we deal with them is your choice. You’re chieftain.</span>
</div>
With that, he returns to his duties, leaving you to decide what sort of neighbor this new tribe will find waiting for them.
How you deal with the unknown tribe is now up to you.
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated</span>
<span class="value">Deal with the Unknown Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Meet your new neighbors.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<run setup.campNpcs.addOutcast()>>
<<if setup.hubScenes.registerRecentEvent("outcast_arrival", $turn, 2)>>
<<run setup.hubScenes.invalidate("outcast_arrival")>>
<</if>>
/* Create the quest once */
<<addQuestAdjacentToCamp
"q_outcast_brother_01"
"Save the Outcast’s Brother"
"The hunters are close. If you move quickly, you can reach him before they do."
"Go to the marked tile and use Expedition."
"Quest1_BrotherSave">>
<<run setup.outcastBrotherQuest.configureTimer("q_outcast_brother_01")>>
/* Optional: track it so its marker stands out */
<<set $trackedQuestId = "q_outcast_brother_01">>
<</silently>>
''<div class="hub-textbox">
<p>You consider her request for a moment, then nod.</p>
<p>Some of the tension leaves her shoulders. It escapes in a breath she seems not to have realized she was holding.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Good.”</span></div>
<p>She leans forward and lowers her voice.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“They don't roam blindly. They move the way they always have. They follow water when they can, and keep to high ground when they can't. They close in slowly.”</span></div>
<p>Her eyes drift toward the edge of camp and the country beyond it.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“They'll still be nearby. Close enough that the tracks won't be cold. Far enough away that they think they have time.”</span></div>
<p>She straightens as much as her wound allows.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“If we move soon, we can reach him before they finish it.”</span></div>
<p>She cannot give you an exact place. Only paths, signs, and the habits of the people hunting him.</p>
<p>It will have to be enough.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Help the Outcast save her brother</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Go find her brother.">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
<p>The silence lasts long enough for her to understand your answer.</p>
<p>Something closes behind her eyes. There is no outburst, and little surprise. She simply exhales and gives a small nod, as though confirming something to herself.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Then I won't stay. Not while he's still out there.”</span></div>
<p>She begins gathering herself, carefully testing how much weight her wounded side will bear. Pain crosses her face, but it does not change her decision.</p>
<p>No one moves to stop her.</p>
<p>Before she leaves, she pauses and turns back toward you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Thank you. For healing me.”</span></div>
<p>Her voice is restrained, almost flat, but the gratitude behind it is genuine.</p>
<p>She leaves before the sun reaches its height and heads back into the trees without looking over her shoulder.</p>
<p>Whether she reaches her brother before the hunters do remains unanswered.</p>
<p>From here, nature and luck will decide. As they so often do.</p>
</div>''
<div class="hub-buttons">
<<button "Let fate decide.">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
<p>You move toward her, and the decision needs no explanation.</p>
<p>Your hunters understand at once. One lowers his spear while another steps forward to help. Whatever uncertainty lingered a moment ago gives way to the practical business of dealing with an injured stranger. Wounded bodies are hardly rare in this world.</p>
<p>The woman barely reacts. She lies where she fell, eyes half-lidded and breathing unevenly. Whatever drove her this far has already spent nearly everything she had.</p>
<p>Up close, the wound looks worse. It is not fresh, but it is angry, with blood soaked through hide and into the soil beneath her. The sort of injury that punishes delay.</p>
<p>One of your hunters crouches beside her, then pauses and looks to you. Your answer does not require words.</p>
<p>They lift her carefully.</p>
<p>She is lighter than you expected, not frail so much as exhausted by whatever forced her to run this far. Her head lolls as they move her, dark hair slipping across her face. She does not wake.</p>
<p>You turn back toward camp with the stranger in your hunters' arms and the forest closing quietly behind you.</p>
<p>Whether saving her was mercy, curiosity, self-interest, or something you have not yet put a name to is a question only you can answer.</p>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "meeting_morning">>
<</button>>
</div>''<div class="hub-textbox">
<p>You do nothing.</p>
<p>The moment stretches without ceremony. No omen follows. The forest offers no judgment. Time simply continues to pass.</p>
<p>She remains where she fell, one hand pressed to her side and each breath shallow. For several heartbeats her eyes stay on you, searching your face for some sign that your decision might change.</p>
<p>It does not.</p>
<p>Something in her expression dulls. Not fear, exactly, and not anger. Acceptance.</p>
<p>Her fingers loosen in the dirt. She turns her face toward the trees, as though already considering what strength she has left and where it might carry her.</p>
<p>Your hunters shift behind you. One glances from the woman to you. Another looks toward the forest edge. Nobody speaks.</p>
<p>Is leaving her cruel? Perhaps.</p>
<p>In a world like this, wounded people abandoned alone usually do not return. Some crawl farther than anyone expects. Some survive the night. Once in a while, someone surprises everyone.</p>
<p>Most do not.</p>
<p>You turn away first, and your hunters follow.</p>
<p>The forest swallows your footsteps quickly. Behind you there is no curse or accusation, only wind moving through leaves around a wounded woman you chose to leave to whatever comes next.</p>
</div>''
<div class="hub-buttons">
<<button "Leave her to the forest.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Stop the main theme (and anything else) the moment we enter this passage */
<<run setup.stopAllAudio()>>
/* Start the intro/dream track */
<<run setup.playIntro()>>
<</silently>>
''<div class="hub-textbox">
After the day’s work around camp is finished, you take your hunters out to lay in meat for the coming winter.
<br><br>
You track your quarry for hours—reading broken twigs, crushed grass, the faintest smears of sign—until, as always, you pull ahead. You don’t mean to. It just happens. Even your fastest hunters struggle to match your pace now, and with each passing day it becomes harder for them to pretend otherwise.
<br><br>
Then it starts again.
<br><br>
Not a sound in the air—nothing your ears can catch—yet something in you stirs. A whisper without words, pressing at the back of your thoughts. Beckoning. Calling. Drawing you deeper between the trees.
<br><br>
The need to obey is unbearable. Too primal. Too instinctive. You follow an invisible path, your legs moving with a certainty that doesn’t feel like your own, until the forest thins and you find yourself standing before it— <!-- IMAGE PLACEHOLDER -->
<div class="hub-image">
<img src="images/expeditions/WhisperQuest/CaveEnterance.png" alt="A cave enterance" />
</div>
<br><br>
The cave from your dreams.
<br><br>
Ordinary. Almost laughably mundane. Just a dark mouth in a hillside. And still, the moment you see it, your heart tightens, because the entrance feels like it could lead to every answer you’ve ever wanted… or to nothing at all.
</div>''
<div class="hub-buttons">
<<button "Enter">>
/* Put your next passage name here */
<<goto "Expedition_WhisperingMouth_1">>
<</button>>
</div><<silently>>
/* Safety */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<</silently>>
''<div class="hub-textbox">
When you step into the cave, you don’t find anything you can name as important.
<br><br>
It’s a small space—barely large enough for ten people to stand shoulder-to-shoulder. No tunnels. No chambers. No hidden depth. And yet the excitement doesn’t fade. That strange, wordless emotion that’s haunted you since the dream—since the moment you saw the entrance—clings to you like smoke. A nostalgia for something that has never happened.
<br><br>
Your hands rise to the walls almost on their own.
<br><br>
The stone is the smoothest thing you’ve ever touched. Too smooth. Its color is strange as well: the same dull grey as the rocks outside, and yet it feels… old in a way nature doesn’t make. Like age has worn it, not wind.
<br><br>
Pebbles litter the ground. No skitter of rodents. No whisper of insects. Even the air feels held. The scattered stones begin to look less like debris and more like arrangement—an order that makes no sense, but an order all the same.
<br><br>
You crouch and start to pick them up, one by one.
<br><br>
Just rocks. Every single one.
<br><br>
Until, after a while—
<div class="hub-image">
<img src="images/expeditions/WhisperQuest/StoneArtifact.png" alt="A strange violet-sheened stone" />
</div>
<br><br>
—you find it.
<br><br>
You don’t know what it is, only that it isn’t like anything you’ve held before. A small stone, strangely glossy, catching what little light there is with a muted violet sheen. The moment it settles into your palm, something in you buckles. Nostalgia hits so hard you nearly gasp, nearly drop to your knees—grief and longing for a life you’ve never lived.
<br><br>
Then it’s gone.
<br><br>
The purple stone is only a stone again. Cold and solid and ordinary.
<br><br>
And yet… it leaves warmth behind. Not in your skin, but deeper—like an ember pressed into your chest.
<br><br>
You slip it into your pocket and turn to leave.
<br><br>
At the entrance, you glance back one last time—and your eyes seem to betray you. For a heartbeat, in the cave’s smooth wall, you see a face where no face should be: a reflection that mirrors your own too closely to be chance.
<br><br>
You blink.
<br><br>
It’s gone.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Artifact Acquired</span>
<span class="value">Strange Stone</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Return to camp">>
<<silently>>
/* Grant artifact (idempotent: grant() won't duplicate ownership) */
<<if setup.artifacts and setup.artifacts.grant>>
<<if !setup.artifacts.owns or !setup.artifacts.owns("relic_strange_stone_awakened")>>
<<run setup.artifacts.grant("relic_strange_stone")>>
<</if>>
<</if>>
/* Complete the expedition quest before beginning the stone's markerless mystery. */
<<set _qid = "q_whispering_mouth_01">>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and $quests[_i].id is _qid>>
<<set $quests[_i].status = "complete">>
<<set $quests[_i].objective = "The cave has been explored and the strange stone recovered.">>
<<set $quests[_i].markerRevealed = false>>
<<set $quests[_i].targetX = null>>
<<set $quests[_i].targetY = null>>
<<set $quests[_i].expeditionPassage = "">>
<<set $questFlags.q_whispering_mouth_01_foundStone = true>>
<<set $questFlags.q_whispering_mouth_01_done = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if $trackedQuestIds and $trackedQuestIds.length>>
<<set $trackedQuestIds = $trackedQuestIds.filter(function (id) { return String(id) !== _qid; })>>
<</if>>
<<if String($trackedQuestId ?? "") is _qid>><<set $trackedQuestId = null>><</if>>
<</silently>>
<<if !$questFlags.q_strange_stone_secrets_01_done>>
<<addQuestMarkerless
"q_strange_stone_secrets_01"
"Secrets of the Strange Stone"
"The glossy violet stone recovered from the Whispering Mouth carries memories that do not belong to you."
"Maybe using the strange stone often enough will reveal more of its secrets..."
""
>>
<<silently>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if !$trackedQuestIds.includes("q_strange_stone_secrets_01")>><<run $trackedQuestIds.push("q_strange_stone_secrets_01")>><</if>>
<<set $trackedQuestId = "q_strange_stone_secrets_01">>
<</silently>>
<</if>>
<<goto "Hub_1">>
<</button>>
</div><div class="system-screen system-extras-screen" id="system-extras">
<div class="system-shell system-extras-shell">
<header class="system-header">
<div>
<div class="system-kicker">System</div>
<h1 class="system-title">Extras</h1>
<p class="system-subtitle">Additional information and game utilities.</p>
</div>
<div class="system-return-slot">
<<button "Return">><<run setup.helpNav.exit()>><</button>>
</div>
</header>
<main class="system-page-panel">
<div class="system-menu-list">
<article class="system-menu-entry">
<div>
<div class="system-menu-entry-title">Help</div>
<p class="system-menu-entry-copy">Game explanations, mechanics, and reference information.</p>
</div>
<div class="system-entry-action">
<<button "Open">><<run setup.systemHelp.open("overview")>><</button>>
</div>
</article>
<article class="system-menu-entry">
<div>
<div class="system-menu-entry-title">Credits</div>
<p class="system-menu-entry-copy">The creators, artists, and supporters behind The First Gods.</p>
</div>
<div class="system-entry-action">
<<button "Open">><<run setup.credits.open()>><</button>>
</div>
</article>
<<if Story.has("Sandbox")>>
<article class="system-menu-entry">
<div>
<div class="system-menu-entry-title">Sandbox Console</div>
<p class="system-menu-entry-copy">Tier 4 testing tools for shaping live story state.</p>
</div>
<div class="system-entry-action">
<<button "Open">><<goto "Sandbox">><</button>>
</div>
</article>
<<else>>
<article class="system-menu-entry is-disabled" aria-disabled="true">
<div>
<div class="system-menu-entry-title">Sandbox Console</div>
<p class="system-menu-entry-copy">Testing tools for shaping live story state.</p>
<span class="system-menu-entry-note">Tier 4 Patron Build</span>
</div>
<div class="system-entry-action">
<button type="button" disabled>Locked</button>
</div>
</article>
<</if>>
</div>
</main>
</div>
</div><<silently>>
<<set _hasFed = (setup.federation && setup.federation.hasFederation) ? setup.federation.hasFederation() : false>>
<<set _fed = $federation ?? null>>
<<set _members = _hasFed ? setup.federation.getMembers() : []>>
<<set _coh = _hasFed ? setup.federation.calcCohesionEquilibrium() : null>>
<<set _targetCohesion = _coh ? Math.max(0, Math.min(100, Number(_coh.value ?? 0))) : 0>>
<<set _currentCohesion = _hasFed ? setup.federation.getEffectiveCohesion() : null>>
<<set _cohPct = _hasFed ? Math.max(0, Math.min(100, Number(_currentCohesion ?? 0))) : 0>>
<<set _status = _hasFed ? setup.federation.getCohesionStatus(_currentCohesion) : "Unformed">>
<<set _statusClass = _cohPct >= 80 ? "is-flourishing" : (_cohPct >= 60 ? "is-good" : (_cohPct >= 40 ? "is-strained" : (_cohPct >= 20 ? "is-crumbling" : "is-breaking")))>>
<<run setup.federation && setup.federation.decorateScreen && setup.federation.decorateScreen(_cohPct, _statusClass)>>
<</silently>>
<<nobr>>
<div class="federation-wrap">
<div class="federation-shell">
<<if !_hasFed>>
<div class="federation-empty-shell">
<div class="federation-empty-card">
<div class="federation-eyebrow">Council Fire</div>
<div class="federation-title">FEDERATION</div>
<div class="federation-empty">No federation has been formed yet. Bind a friendly tribe from the tribe screen to raise the first shared council fire.</div>
<div class="federation-actions is-empty">
<<button "Return">><<goto "Hub_1">><</button>>
</div>
</div>
</div>
<<else>>
<header class="federation-head">
<div>
<div class="federation-eyebrow">Shared Council</div>
<div class="federation-title"><<print _fed.name ?? "Player Federation">></div>
<div class="federation-subtitle">Shared council, shared oath, separate fires. The federation is a pact of tribes standing together without becoming one tribe.</div>
</div>
<div class="federation-head-actions">
<div class="federation-status-pill"><<print _status>></div>
<div class="federation-actions">
<<button "Rename">>
<<set $lastFederationRenameResult = null>>
<<run Dialog.setup("Rename Federation", "federation-reform-dialog federation-rename-dialog")>>
<<run $(Dialog.body()).wiki(Story.get("Federation_RenameDialog").processText())>>
<<run Dialog.open()>>
<</button>>
<span class="federation-danger-action">
<<button "Disband Federation">>
<<set $pendingFederationDisband = true>>
<<set $lastFederationDisbandResult = null>>
<<run Dialog.setup("Disband Federation", "federation-reform-dialog")>>
<<run $(Dialog.body()).wiki(Story.get("Federation_DisbandDialog").processText())>>
<<run Dialog.open()>>
<</button>>
</span>
<<button "Return">><<goto "Hub_1">><</button>>
</div>
</div>
</header>
<section class="federation-overview">
<div class="federation-cohesion-card has-tip" tabindex="0" data-tip="Cohesion measures how strongly federation members trust the shared pact. Higher cohesion keeps the federation stable and fuels reforms. Below 50, members become unsatisfied and might leave the federation.">
<div class="federation-eyebrow">Current Cohesion</div>
<div class="federation-cohesion-top">
<div class="federation-cohesion-value"><<print _cohPct>></div>
<div class="federation-cohesion-status"><<print _status>><br><span>used for reforms</span></div>
</div>
<div class="federation-meter">
<div class="federation-meter-track">
<div class="federation-meter-fill"></div>
<span class="federation-meter-tick t20"></span>
<span class="federation-meter-tick t40"></span>
<span class="federation-meter-tick t60"></span>
<span class="federation-meter-tick t80"></span>
</div>
<div class="federation-meter-labels">
<span>Breaking</span><span>Crumbling</span><span>Strained</span><span>Good</span><span>Flourishing</span>
</div>
</div>
</div>
<div class="federation-stat-grid">
<div class="federation-stat"><span>Members</span><strong><<print _members.length>></strong></div>
<div class="federation-stat"><span>Target Cohesion</span><strong><<print _targetCohesion>></strong></div>
<div class="federation-stat"><span>Avg Relations</span><strong><<print _coh.averageRelations>></strong></div>
<div class="federation-stat"><span>Future Mods</span><strong><<if _coh.futureModifierTotal >= 0>>+<</if>><<print _coh.futureModifierTotal>></strong></div>
</div>
</section>
<<if $federationReformNotice>>
<section class="federation-reform-notice">
<div class="federation-panel-title">Recent Reform</div>
<div class="federation-reform-notice-text"><<print $federationReformNotice>></div>
</section>
<</if>>
<section class="federation-main-grid">
<div class="federation-panel federation-members-panel">
<div class="federation-panel-title">Members</div>
<<if _members.length <= 0>>
<div class="federation-empty">The federation exists, but no member tribes are listed yet.</div>
<<else>>
<div class="federation-member-list">
<<for _i = 0; _i < _members.length; _i++>>
<<set _m = _members[_i]>><<set _mMood = (setup.tribes && setup.tribes.getMoodState) ? setup.tribes.getMoodState(_m) : (_m.mood?.state ?? "none")>>
<div class="federation-member-card">
<div class="federation-member-name"><<print _m.name ?? _m.id ?? "Unknown Tribe">></div>
<div class="federation-member-grid">
<div class="federation-member-stat"><span>Relations</span><strong><<print Number(_m.relations ?? 0)>></strong></div>
<div class="federation-member-stat"><span>Temperament</span><strong><<print _m.temperament ?? "unknown">></strong></div>
<div class="federation-member-stat"><span>Mood</span><strong><<print _mMood>></strong></div>
<div class="federation-member-stat"><span>Mil Str</span><strong><<print Number(_m.stats?.milStr ?? _m.milStr ?? 0)>></strong></div>
</div>
</div>
<</for>>
</div>
<</if>>
</div>
<div class="federation-side-stack">
<div class="federation-panel federation-reform-panel">
<div class="federation-panel-title">Federation Reforms</div>
<<run setup.federation.ensureReformState()>>
<div class="federation-reform-tree">
<<for _tier = 1; _tier <= 4; _tier++>>
<<set _tierDefs = setup.federation.getReformsByTier(_tier)>>
<<set _tierLabel = (_tier is 1 ? "I Provision" : (_tier is 2 ? "II Military" : (_tier is 3 ? "III Unity" : "IV Capstone")))>>
<<set _tierPrompt = (_tier is 1 ? "Will we grow through exchange, or through shared stores?" : (_tier is 2 ? "Will our strength be shared, or will one head command it?" : (_tier is 3 ? "Will our people mingle, or will one sacred voice bind them?" : "Bind the federation as a lasting confederation.")))>>
<<set _tierClass = "is-pair">>
<<if _tierDefs.length is 1>><<set _tierClass = "is-solo">><</if>>
<div class="reform-tier-block" @data-tier="_tier">
<div class="reform-tier-head">
<span class="reform-tier-label">Tier <<print _tierLabel>></span>
<span class="reform-tier-prompt"><<print _tierPrompt>></span>
</div>
<div @class="'reform-tier-row '+_tierClass">
<<for _ri = 0; _ri < _tierDefs.length; _ri++>>
<<set _rd = _tierDefs[_ri]>>
<<set _rs = setup.federation.getReformStatus(_rd.id)>>
<<set _rp = setup.federation.previewReform(_rd.id)>>
<<set _rEnabled = (_rs.status is "available" or _rs.status is "taken")>>
<<set _rIcon = setup.federation.iconPath(_rd.id, _rEnabled)>>
<<set _rEx = _rd.exclusiveWith ? setup.federation.getReformDef(_rd.exclusiveWith) : null>>
<div @class="'reform-card is-'+_rs.status">
<div class="reform-card-head">
<div class="reform-card-icon">
<<if _rIcon>>
<img class="reform-card-icon-img" @src="_rIcon" @alt="_rd.name">
<<else>>
<div class="reform-card-icon-placeholder"><<print _rd.name.charAt(0)>></div>
<</if>>
</div>
<div class="reform-card-titles">
<div class="reform-card-name"><<print _rd.name>></div>
<div class="reform-card-category"><<print _rd.category>> · T<<print _rd.tier>></div>
</div>
</div>
<div class="reform-card-stats">
<span class="reform-card-stat">Req <b><<print _rd.cohesionReq>></b></span>
<span class="reform-card-stat">Cost <b>-<<print _rd.cohesionCost>></b></span>
</div>
<div class="reform-card-foot">
<<if _rs.status is "available">>
<<capture _rd>>
<<button "Adopt">>
<<set $pendingReform = _rd.id>>
<<set $lastReformResult = null>>
<<run Dialog.setup("Federation Reform", "federation-reform-dialog")>>
<<run $(Dialog.body()).wiki(Story.get("Federation_ReformDialog").processText())>>
<<run Dialog.open()>>
<</button>>
<</capture>>
<<elseif _rs.status is "taken">>
<span class="reform-card-pill is-taken">In effect</span>
<<elseif _rs.status is "blocked">>
<span class="reform-card-pill is-blocked">Path closed</span>
<<elseif _rs.status is "locked">>
<span class="reform-card-pill is-locked">Locked</span>
<<elseif _rs.status is "insufficient">>
<span class="reform-card-pill is-insufficient">Need <<print _rd.cohesionReq>></span>
<</if>>
</div>
<div class="reform-card-tooltip" role="tooltip">
<div class="reform-tip-name"><<print _rd.name>></div>
<div class="reform-tip-category"><<print _rd.category>> · Tier <<print _rd.tier>></div>
<div class="reform-tip-desc"><<print _rd.description>></div>
<div class="reform-tip-effect"><b>Effect:</b> <<print _rd.effect>></div>
<div class="reform-tip-stats">
<span>Cohesion req: <b><<print _rd.cohesionReq>></b></span>
<span>Cohesion cost: <b>-<<print _rd.cohesionCost>></b></span>
</div>
<<if _rp>>
<div class="reform-tip-meta">Current: <b><<print _rp.currentCohesion>></b> → After: <b><<print _rp.cohesionAfter>></b></div>
<</if>>
<<if _rEx>>
<div class="reform-tip-meta">Blocks: <b><<print _rEx.name>></b></div>
<</if>>
<div class="reform-tip-meta"><<print setup.federation.requirementSummary(_rd)>></div>
<div class="reform-tip-meta">Reactions: <b><<print setup.federation.reactionSummary(_rd)>></b></div>
<div class="reform-tip-status"><<print _rs.reason>></div>
</div>
</div>
<</for>>
</div>
</div>
<</for>>
</div>
</div>
</div>
</section>
<</if>>
</div>
</div>
<</nobr>><<silently>>
<<set _reformId = $pendingReform ?? "">>
<<set _preview = _reformId ? setup.federation.previewReform(_reformId) : null>>
<<set _result = $lastReformResult ?? null>>
<</silently>>
<<nobr>>
<div class="federation-wrap">
<div class="federation-shell">
<header class="federation-head">
<div>
<div class="federation-eyebrow">Reform Decision</div>
<div class="federation-title">
<<if _result>>Reform Adopted
<<elseif _preview>><<print _preview.def.name>>
<<else>>Reform<</if>>
</div>
<div class="federation-subtitle">
<<if _result>>The council fire shifts. The pact has changed.
<<elseif _preview>>A major political decision. Confirm only when ready.
<<else>>No reform selected.<</if>>
</div>
</div>
<div class="federation-head-actions">
<div class="federation-actions">
<<button "Back to Federation">>
<<set $pendingReform = null>>
<<set $lastReformResult = null>>
<<goto "Federation">>
<</button>>
</div>
</div>
</header>
<<if _result>>
<section class="federation-panel federation-reform-result">
<div class="federation-panel-title">Result</div>
<div class="federation-reform-result-grid">
<div class="federation-reform-stat"><span>Reform</span><strong><<print _result.reformName>></strong></div>
<div class="federation-reform-stat"><span>Cohesion before</span><strong><<print _result.cohesionBefore>></strong></div>
<div class="federation-reform-stat"><span>Cohesion after</span><strong><<print _result.cohesionAfter>></strong></div>
<div class="federation-reform-stat"><span>Cohesion lost</span><strong>-<<print _result.cohesionCost>></strong></div>
</div>
<<if _result.blocked>>
<div class="federation-reform-meta">Closed path: <<print setup.federation.getReformDef(_result.blocked)?.name ?? _result.blocked>></div>
<</if>>
<<if _result.bound>>
<div class="federation-reform-meta is-bound">The federation is now permanently bound.</div>
<</if>>
<div class="federation-panel-title" style="margin-top:14px;">Reactions</div>
<<if _result.reactions.length is 0>>
<div class="federation-empty">No member tribes to react.</div>
<<else>>
<div class="federation-reform-reaction-list">
<<for _i = 0; _i < _result.reactions.length; _i++>>
<<set _rx = _result.reactions[_i]>>
<div class="federation-reform-reaction-row <<if _rx.relationDelta > 0>>is-pos<<elseif _rx.relationDelta < 0>>is-neg<<else>>is-neutral<</if>>">
<span class="rx-name"><<print _rx.tribeName>></span>
<span class="rx-temp"><<print _rx.temperament>></span>
<span class="rx-delta"><<if _rx.relationDelta >= 0>>+<</if>><<print _rx.relationDelta>></span>
<span class="rx-after"><<print _rx.relationsBefore>> → <<print _rx.relationsAfter>></span>
</div>
<</for>>
</div>
<</if>>
<div class="federation-actions" style="margin-top:14px;">
<<button "Return to Federation">>
<<set $pendingReform = null>>
<<set $lastReformResult = null>>
<<goto "Federation">>
<</button>>
</div>
</section>
<<elseif _preview and _preview.status.status is "available">>
<section class="federation-panel federation-reform-confirm">
<div class="federation-panel-title">Confirm Reform</div>
<div class="federation-reform-desc"><<print _preview.def.description>></div>
<div class="federation-reform-effect"><strong>Effect:</strong> <<print _preview.def.effect>></div>
<div class="federation-reform-stats">
<div class="federation-reform-stat"><span>Current cohesion</span><strong><<print _preview.currentCohesion>></strong></div>
<div class="federation-reform-stat"><span>Cohesion required</span><strong><<print _preview.cohesionReq>></strong></div>
<div class="federation-reform-stat"><span>Cohesion cost</span><strong>-<<print _preview.cohesionCost>></strong></div>
<div class="federation-reform-stat"><span>Cohesion after</span><strong><<print _preview.cohesionAfter>></strong></div>
</div>
<<if _preview.blocks>>
<div class="federation-reform-meta">Adopting this will close the path to: <strong><<print _preview.blocks.name>></strong></div>
<</if>>
<div class="federation-panel-title" style="margin-top:14px;">Expected Reactions</div>
<<if _preview.reactions.length is 0>>
<div class="federation-empty">No member tribes to react.</div>
<<else>>
<div class="federation-reform-reaction-list">
<<for _pi = 0; _pi < _preview.reactions.length; _pi++>>
<<set _px = _preview.reactions[_pi]>>
<div class="federation-reform-reaction-row <<if _px.relationDelta > 0>>is-pos<<elseif _px.relationDelta < 0>>is-neg<<else>>is-neutral<</if>>">
<span class="rx-name"><<print _px.tribeName>></span>
<span class="rx-temp"><<print _px.temperament>></span>
<span class="rx-delta"><<if _px.relationDelta >= 0>>+<</if>><<print _px.relationDelta>></span>
<span class="rx-after">rel <<print _px.currentRelations>></span>
</div>
<</for>>
</div>
<</if>>
<div class="federation-reform-warning">
This is a major political decision. The federation will lose <strong><<print _preview.cohesionCost>></strong> cohesion and the alternative path will close.
</div>
<div class="federation-actions">
<<button "Confirm Adoption">>
<<set $lastReformResult = setup.federation.adoptReform($pendingReform)>>
<<if $questFlags and $questFlags.q_dominate_region_started>><<updateVictory_DominateRegion>><</if>>
<<set $pendingReform = null>>
<<goto "Federation_AdoptReform">>
<</button>>
<<button "Cancel">>
<<set $pendingReform = null>>
<<goto "Federation">>
<</button>>
</div>
</section>
<<else>>
<section class="federation-panel">
<div class="federation-panel-title">Cannot Adopt</div>
<div class="federation-reform-desc">
<<if _preview>><<print _preview.status.reason>><<else>>No reform selected.<</if>>
</div>
<div class="federation-actions">
<<button "Back to Federation">>
<<set $pendingReform = null>>
<<goto "Federation">>
<</button>>
</div>
</section>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<div id="federation-disband-dialog-root" class="reform-dialog-root">
<div id="federation-disband-dialog-content">
<<include "Federation_DisbandDialog_Confirm">>
</div>
</div>
<</nobr>><<silently>>
<<set _hasFed = setup.federation and setup.federation.hasFederation and setup.federation.hasFederation()>>
<<set _fed = _hasFed ? setup.federation.ensureState() : null>>
<<set _members = _hasFed ? setup.federation.getMembers() : []>>
<</silently>>
<<nobr>>
<div class="reform-dialog-body">
<div class="reform-dialog-title">Disband Federation</div>
<div class="reform-dialog-subtitle">A final council decision</div>
<<if _hasFed>>
<div class="reform-dialog-desc">You can end <b><<print _fed.name ?? "the federation">></b> immediately. The shared oath will be broken, all federation reform effects and buffs will be lost, and the former members will once again be treated as outside tribes for hostile interactions and events.</div>
<div class="reform-dialog-warning is-danger">The other members will not be happy with this decision. Each current member loses <b>20</b> relations before the federation is disbanded.</div>
<div class="reform-dialog-section-title">Member Reactions</div>
<<if _members.length is 0>>
<div class="reform-dialog-empty">No member tribes remain to react.</div>
<<else>>
<div class="reform-dialog-reactions">
<<for _di = 0; _di < _members.length; _di++>>
<<set _dm = _members[_di]>>
<<set _before = Number(_dm.relations ?? 0)>>
<div class="rd-reaction is-neg">
<span class="rd-name"><<print _dm.name ?? _dm.id>></span>
<span class="rd-temp">Member</span>
<span class="rd-delta">-20</span>
<span class="rd-after"><<print _before>> → <<print _before - 20>></span>
</div>
<</for>>
</div>
<</if>>
<div class="reform-dialog-actions">
<span class="dialog-danger-action">
<<button "Yes, Disband It">>
<<set $lastFederationDisbandResult = setup.federation.disbandByPlayer()>>
<<if $questFlags and $questFlags.q_dominate_region_started>><<updateVictory_DominateRegion>><</if>>
<<set $pendingFederationDisband = false>>
<<replace "#federation-disband-dialog-content">>
<<include "Federation_DisbandDialog_Result">>
<</replace>>
<</button>>
</span>
<<button "Cancel">>
<<set $pendingFederationDisband = false>>
<<run Dialog.close()>>
<</button>>
</div>
<<else>>
<div class="reform-dialog-desc">There is no active federation to disband.</div>
<div class="reform-dialog-actions">
<<button "Close">><<run Dialog.close()>></button>>
</div>
<</if>>
</div>
<</nobr>><<silently>>
<<set _result = $lastFederationDisbandResult ?? null>>
<</silently>>
<<nobr>>
<div class="reform-dialog-body">
<<if _result and _result.ok>>
<div class="reform-dialog-title">Federation Disbanded</div>
<div class="reform-dialog-subtitle">The shared fire goes cold</div>
<div class="reform-dialog-desc"><<print _result.federationName>> has ended. Federation reforms and buffs are no longer active, and former members are once again outside the pact.</div>
<div class="reform-dialog-section-title">Relations Changed</div>
<<if _result.reactions.length is 0>>
<div class="reform-dialog-empty">No tribes were affected.</div>
<<else>>
<div class="reform-dialog-reactions">
<<for _ri = 0; _ri < _result.reactions.length; _ri++>>
<<set _rx = _result.reactions[_ri]>>
<div class="rd-reaction is-neg">
<span class="rd-name"><<print _rx.tribeName>></span>
<span class="rd-temp">Former member</span>
<span class="rd-delta">-20</span>
<span class="rd-after"><<print _rx.relationsBefore>> → <<print _rx.relationsAfter>></span>
</div>
<</for>>
</div>
<</if>>
<<else>>
<div class="reform-dialog-title">No result</div>
<div class="reform-dialog-desc">The federation was not disbanded.</div>
<</if>>
<div class="reform-dialog-actions">
<<button "Close">>
<<set $lastFederationDisbandResult = null>>
<<set $pendingFederationDisband = false>>
<<run Dialog.close()>>
<<goto "Hub_1">>
<</button>>
</div>
</div>
<</nobr>><<nobr>>
<div id="reform-dialog-root" class="reform-dialog-root">
<div id="reform-dialog-content">
<<include "Federation_ReformDialog_Confirm">>
</div>
</div>
<</nobr>><<silently>>
<<set _preview = $pendingReform ? setup.federation.previewReform($pendingReform) : null>>
<</silently>>
<<nobr>>
<<if _preview and _preview.status.status is "available">>
<div class="reform-dialog-body">
<div class="reform-dialog-title"><<print _preview.def.name>></div>
<div class="reform-dialog-subtitle"><<print _preview.def.category>> · Tier <<print _preview.def.tier>> · A major political decision</div>
<div class="reform-dialog-desc"><<print _preview.def.description>></div>
<div class="reform-dialog-effect"><b>Effect:</b> <<print _preview.def.effect>></div>
<div class="reform-dialog-stats">
<div class="rd-stat"><span>Current cohesion</span><strong><<print _preview.currentCohesion>></strong></div>
<div class="rd-stat"><span>Required</span><strong><<print _preview.cohesionReq>></strong></div>
<div class="rd-stat"><span>Cost</span><strong>-<<print _preview.cohesionCost>></strong></div>
<div class="rd-stat"><span>After</span><strong><<print _preview.cohesionAfter>></strong></div>
</div>
<<if _preview.blocks>>
<div class="reform-dialog-meta">Adopting this will close the path to: <b><<print _preview.blocks.name>></b></div>
<</if>>
<div class="reform-dialog-section-title">Expected Reactions</div>
<<if _preview.reactions.length is 0>>
<div class="reform-dialog-empty">No member tribes to react.</div>
<<else>>
<div class="reform-dialog-reactions">
<<for _pi = 0; _pi < _preview.reactions.length; _pi++>>
<<set _px = _preview.reactions[_pi]>>
<div @class="'rd-reaction '+(_px.relationDelta > 0 ? 'is-pos' : (_px.relationDelta < 0 ? 'is-neg' : 'is-neutral'))">
<span class="rd-name"><<print _px.tribeName>></span>
<span class="rd-temp"><<print _px.temperament>></span>
<span class="rd-delta"><<if _px.relationDelta >= 0>>+<</if>><<print _px.relationDelta>></span>
<span class="rd-after"><<print _px.currentRelations>> → <<print _px.relationAfter>></span>
</div>
<</for>>
</div>
<</if>>
<div class="reform-dialog-warning">
This is a major political decision. The federation will lose <b><<print _preview.cohesionCost>></b> cohesion and the alternative path will close.
</div>
<div class="reform-dialog-actions">
<<button "Confirm Adoption">>
<<set $lastReformResult = setup.federation.adoptReform($pendingReform)>>
<<if $questFlags and $questFlags.q_dominate_region_started>><<updateVictory_DominateRegion>><</if>>
<<set $pendingReform = null>>
<<replace "#reform-dialog-content">>
<<include "Federation_ReformDialog_Result">>
<</replace>>
<</button>>
<<button "Cancel">>
<<set $pendingReform = null>>
<<run Dialog.close()>>
<</button>>
</div>
</div>
<<else>>
<div class="reform-dialog-body">
<div class="reform-dialog-title">Cannot Adopt</div>
<div class="reform-dialog-desc"><<if _preview>><<print _preview.status.reason>><<else>>No reform selected.<</if>></div>
<div class="reform-dialog-actions">
<<button "Close">>
<<set $pendingReform = null>>
<<run Dialog.close()>>
<</button>>
</div>
</div>
<</if>>
<</nobr>><<silently>>
<<set _result = $lastReformResult ?? null>>
<</silently>>
<<nobr>>
<<if _result and _result.ok>>
<div class="reform-dialog-body">
<div class="reform-dialog-title"><<print _result.reformName>> — Adopted</div>
<div class="reform-dialog-subtitle">The council fire shifts. The pact has changed.</div>
<div class="reform-dialog-stats">
<div class="rd-stat"><span>Cohesion before</span><strong><<print _result.cohesionBefore>></strong></div>
<div class="rd-stat"><span>Cohesion lost</span><strong>-<<print _result.cohesionCost>></strong></div>
<div class="rd-stat"><span>Cohesion after</span><strong><<print _result.cohesionAfter>></strong></div>
</div>
<<if _result.blocked>>
<div class="reform-dialog-meta">Closed path: <b><<print setup.federation.getReformDef(_result.blocked)?.name ?? _result.blocked>></b></div>
<</if>>
<<if _result.bound>>
<div class="reform-dialog-meta is-bound">The federation is now permanently bound.</div>
<</if>>
<div class="reform-dialog-section-title">Reactions</div>
<<if _result.reactions.length is 0>>
<div class="reform-dialog-empty">No member tribes to react.</div>
<<else>>
<div class="reform-dialog-reactions">
<<for _ri = 0; _ri < _result.reactions.length; _ri++>>
<<set _rx = _result.reactions[_ri]>>
<div @class="'rd-reaction '+(_rx.relationDelta > 0 ? 'is-pos' : (_rx.relationDelta < 0 ? 'is-neg' : 'is-neutral'))">
<span class="rd-name"><<print _rx.tribeName>></span>
<span class="rd-temp"><<print _rx.temperament>></span>
<span class="rd-delta"><<if _rx.relationDelta >= 0>>+<</if>><<print _rx.relationDelta>></span>
<span class="rd-after"><<print _rx.relationsBefore>> → <<print _rx.relationsAfter>></span>
</div>
<</for>>
</div>
<</if>>
<div class="reform-dialog-actions">
<<button "Close">>
<<set $pendingReform = null>>
<<set $lastReformResult = null>>
<<run Dialog.close()>>
<<goto "Federation">>
<</button>>
</div>
</div>
<<else>>
<div class="reform-dialog-body">
<div class="reform-dialog-title">No result</div>
<div class="reform-dialog-actions">
<<button "Close">>
<<run Dialog.close()>>
<</button>>
</div>
</div>
<</if>>
<</nobr>><<silently>>
<<set _hasFed = setup.federation and setup.federation.hasFederation and setup.federation.hasFederation()>>
<<set _fed = _hasFed ? setup.federation.ensureState() : null>>
<</silently>>
<<nobr>>
<div id="federation-rename-dialog-root" class="reform-dialog-root">
<div class="reform-dialog-body">
<div class="reform-dialog-title">Rename Federation</div>
<div class="reform-dialog-subtitle">A name before the shared oath</div>
<<if _hasFed>>
<div class="reform-dialog-desc">Choose the custom name used before the fixed <b>Federation</b> suffix.</div>
<div class="federation-rename-field">
<input id="federation-rename-input" type="text" maxlength="42" autocomplete="off" aria-label="Federation name">
<div class="federation-rename-suffix">Federation</div>
</div>
<div id="federation-rename-error" class="federation-rename-error"></div>
<<run setTimeout(function () { var input = document.getElementById("federation-rename-input"); if (input) { input.value = setup.federation.getEditableNamePart(); input.focus(); input.select(); } }, 0)>>
<div class="reform-dialog-actions">
<<button "Save Name">>
<<set _renameValue = jQuery("#federation-rename-input").val()>>
<<set $lastFederationRenameResult = setup.federation.rename(_renameValue)>>
<<if $lastFederationRenameResult.ok>>
<<run Dialog.close()>>
<<goto "Federation">>
<<else>>
<<replace "#federation-rename-error">><<print $lastFederationRenameResult.reason>><</replace>>
<</if>>
<</button>>
<<button "Cancel">>
<<set $lastFederationRenameResult = null>>
<<run Dialog.close()>>
<</button>>
</div>
<<else>>
<div class="reform-dialog-desc">There is no active federation to rename.</div>
<div class="reform-dialog-actions">
<<button "Close">><<run Dialog.close()>><</button>>
</div>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<div class="flaws-tracker-shell">
<header class="flaws-tracker-header">
<div class="flaws-tracker-title-wrap">
<span class="flaws-tracker-kicker">Personal Reckoning</span>
<h1 class="flaws-tracker-title">Flaws</h1>
</div>
</header>
<p class="flaws-tracker-lead">Each weight has its own slow tide. Those you carry are marked Acquired; the others stir beneath the surface, building until they emerge.</p>
<div class="flaws-tracker-mount" data-flaws-tracker-mount></div>
<<if $debug>>
<div class="flaws-tracker-debug">
<span class="flaws-tracker-debug-label">Debug · Add Pressure (+25)</span>
<div class="flaws-tracker-debug-row">
<<for _dfi = 0; _dfi < setup.flaws.order.length; _dfi++>>
<<set _dfid = setup.flaws.order[_dfi]>>
<<set _dlabel = (setup.flaws.defs[_dfid] ? setup.flaws.defs[_dfid].label : _dfid)>>
<<capture _dfid, _dlabel>>
<<button _dlabel>>
<<run setup.flaws.debugAddPressure(_dfid, 25)>>
<</button>>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<div class="flaws-tracker-foot">
<button type="button" class="flaws-tracker-return" onclick="SugarCube.setup.flaws.exitTracker()">Return</button>
</div>
</div>
<</nobr>><div class="hub-header">
<div class="hub-title">
Game Over
</div>
</div>
<div class="hub-textbox">
The last fire dies without ceremony.
No footsteps. No voices. No hands left to raise shelter, to carry water, to bury the dead, to keep the stories from unraveling in the dark.
Whatever you were building here—whatever you meant to become—ends in silence.
<br><br>
<<button [[Return to Title|Main_Menu]]>><</button>>
</div><div class="hub-header"><div class="hub-title">Game Over</div></div><div class="hub-textbox">
<p>At some point, you lose yourself in the fighting.</p><p>You remember pieces of it afterward, though not enough to put them back into any sensible order. A spear scraping across your ribs. Someone shouting from somewhere behind you. Your hands closing around a Mishan warrior before another crashes into your side. Blood in your eyes that you wipe away only for more to replace it.</p><p>The battle narrows until there is nothing beyond the next body in front of you.</p><p>You stop thinking about the line, the camp, or how many of your people are still standing. There are only weapons coming toward you and whatever you can reach before they do.</p><p>When awareness finally returns, you are standing in silence.</p><p>The field around you is covered in bodies.</p>
<p>Your people lie among the Mishan in numbers too great to count at a glance. Warriors who marched beneath Kavnok's markings are piled against the places where your defenders made their last stands, some still clutching weapons that never reached you. Others lie farther back where the fighting spread beyond anything resembling a line.</p><p>You search for movement and find none among your own people or among the Mishan.</p><p>The nine warbands that came to destroy your tribe are gone, and so is the tribe they came to destroy.</p><p>For a long time, you simply stand there.</p>
<p>Your wounds have already begun to close. Cuts tighten into new skin, bruises fade, and the deeper injuries slowly stop hurting. Given enough time, there will be little left on your body to prove that any of this happened.</p><p>Around you, there is no such recovery.</p><p>The camp remains where it was, but only as an arrangement of abandoned things. Shelters stand open to the wind. Fires burn down without anyone feeding them. Baskets, tools and clothing lie where they were dropped when people ran to fight or tried to get away.</p><p>You call out once.</p><p>Nothing answers.</p><p>Eventually even that feels pointless.</p>
<p>The fires die. Rain darkens the earth and carries away the worst of the blood. Animals begin returning to the edges of the camp, cautious at first, then less so as the days pass without anyone left to drive them away.</p><p>You remain.</p><p>There is nobody to tell you what you survived for.</p><p>No one speaks your name or waits for your judgment. No one asks for your protection, fears your anger, follows your orders or kneels before something they believe you to be. Whatever shape your existence had begun to take was built as much from those people as from anything within you.</p><p>Without them, it becomes harder to remember what that shape was supposed to be.</p>
<p>Perhaps you leave eventually. Perhaps you remain among the empty shelters until there is little left of them but collapsed hides and rotting timber.</p><p>Years pass.</p><p>The stories end because there is nobody left to tell them. Grass overtakes the paths between the shelters, trees reclaim the cleared ground, and what remains of the camp slowly becomes indistinguishable from the land around it.</p><p>At some point, $user disappears.</p><p>Where he went, or why, nobody knows.</p><p>There was nobody left to see him leave, and nobody left to care that he had gone.</p><br><br><<button [[Return to Title|Main_Menu]]>><</button>></div><div class="hub-textbox">
<h2>Overview</h2>
<p>The Help section is a reference for the game's main systems.</p>
<p>Use it whenever you need to check how a mechanic works, where a particular action is found, or what one of the game's values represents.</p>
<p>The Help pages focus on practical information rather than story or setting explanations.</p>
<h3>Where Should I Look?</h3>
<p>If you are unsure where to start:</p>
<ul>
<li>Hub & Turns - the main interface, turn flow, Seasons, and End Turn.</li>
<li>Stats & Checks - what your six stats do and how checks are resolved.</li>
<li>Tribe & Economy - Population, Food, Resources, Goods, Stability, Zeal, and Belief generation.</li>
<li>Season Plans & Action Points - choosing tribe-wide actions and spending AP.</li>
<li>Camp Works & Crafting - creating equipment and developing your camp.</li>
<li>Belief, Aspects & Powers - stat upgrades, Powers, Aspects, Signs, and Mandates.</li>
<li>Traditions - how your tribe's culture changes in response to your actions.</li>
<li>Map & Migration - terrain, exploration, moving camp, and Long March.</li>
<li>Quests & Expeditions - objectives, quest locations, and using Expedition.</li>
<li>Other Tribes & Federation - diplomacy, relations, trade, hostility, and alliances.</li>
<li>Military & Raids - Military Strength and the raid combat system.</li>
<li>Events - how normal, major, and story events are triggered and resolved.</li>
</ul>
<p>You do not need to read every Help page before playing.</p>
<p>The tutorial introduces the most important controls. Help is here when you want a more detailed explanation or need to look something up later.</p>
</div><div class="hub-textbox">
<h2>Belief, Aspects & Powers</h2>
<h3>Belief</h3>
<p>Belief is your main divine currency. It is used to improve your stats, acquire Powers, activate some supernatural abilities, and pay for certain divine actions.</p>
<p>Your current Belief is shown in the Status panel. Belief can be gained or lost through events, rituals, your tribe's Zeal, Powers, and other game systems.</p>
<h3>Improving Your Stats</h3>
<p>Your six main stats are Strength, Endurance, Wisdom, Leadership, Charisma, and Stewardship.</p>
<p>To improve them, open: Character -> Powers</p>
<p>The stat upgrade section lets you add proposed increases before paying for them. The total Belief cost is shown before you confirm the changes.</p>
<ul>
<li>+ adds a pending stat increase.</li>
<li>Undo removes pending changes.</li>
<li>Confirm spends the listed Belief and applies the upgrades.</li>
</ul>
<p>Higher stats generally cost more Belief to improve. Traits, Aspects, or other effects may reduce the cost of particular stats.</p>
<p>For an explanation of what each stat does and how checks work, see Stats & Checks.</p>
<h3>Powers</h3>
<p>Powers are supernatural abilities that can give you new options during events, combat, diplomacy, rituals, and other situations.</p>
<p>Powers are managed from: Character -> Powers</p>
<p>Each Power has its own requirements. These can include:</p>
<ul>
<li>a Belief cost;</li>
<li>minimum stats;</li>
<li>another Power;</li>
<li>a particular Aspect or Aspect level;</li>
<li>story progress.</li>
</ul>
<p>If a Power is unavailable, its entry should show why.</p>
<p>Acquiring a Power and using it are separate things. Some Powers only cost Belief when acquired, while others also cost Belief each time they are activated.</p>
<h3>Power Limit</h3>
<p>You can only hold a limited number of Powers at once. This is your Power Limit.</p>
<p>Most acquired Powers use one point of this limit. Some traits, Aspect effects, story rewards, or other bonuses can increase your Power Limit or make a particular Power stop counting toward it.</p>
<p>If you meet a Power's other requirements but cannot acquire it, check whether your Power Limit is full.</p>
<h3>Aspects</h3>
<p>Aspects represent the kinds of divine behavior your tribe increasingly associates with you.</p>
<p>The four current Aspects are:</p>
<ul>
<li>Blood - sacrifice, violence, fear, war, punishment, and power gained through loss.</li>
<li>Life - protection, healing, kinship, food, shelter, mercy, and preserving the tribe.</li>
<li>Elements - fire, weather, cold, stone, storms, and influence over the natural world.</li>
<li>Influence - persuasion, reputation, command, desire, social pressure, and control through presence.</li>
</ul>
<p>You can view them under: Character -> Aspect</p>
<h3>Signs and Aspect Levels</h3>
<p>Your actions can give or remove Signs for an Aspect.</p>
<p>For example, violent or sacrificial choices may increase Blood Signs, while healing or protecting people may increase Life Signs. Rituals, Season Plans, raids, diplomacy, events, and other choices can all affect Signs.</p>
<p>Signs determine your level in each Aspect.</p>
<p>Current thresholds are:</p>
<ul>
<li>Level 1: 10 Signs</li>
<li>Level 2: 50 Signs</li>
<li>Level 3: 100 Signs</li>
</ul>
<p>Higher Aspect levels unlock or strengthen bonuses connected to that Aspect.</p>
<p>You do not spend Signs. They are a measure of how strongly your actions have established that part of your divinity.</p>
<h3>Adopting Aspects</h3>
<p>Gaining Signs is not the same as formally making an Aspect part of your divine identity.</p>
<p>Once the required conditions are met, an Aspect can be adopted as part of your active divine identity.</p>
<p>Your first adopted Aspect becomes your Primary Aspect. You can later take Secondary Aspects as well.</p>
<p>Primary and Secondary Aspects can have different level caps, and taking additional Aspects can limit how far some of them can develop. The Aspect screen shows the current limits.</p>
<p>Aspect bonuses that require an Aspect to be active only apply when that Aspect has actually been adopted.</p>
<h3>Opposing Aspects</h3>
<p>Some Aspects conflict with one another.</p>
<p>The clearest example is Blood and Life. Actions that strengthen one may sometimes weaken the other.</p>
<p>This does not mean every Blood action automatically removes Life Signs or vice versa. The result depends on the specific action.</p>
<h3>Mandates</h3>
<p>After adopting an Aspect, you may receive Aspect Mandates.</p>
<p>Mandates are recurring responsibilities tied to the kind of god you are becoming. They appear on the Quests screen.</p>
<p>Completing Mandates helps maintain and strengthen that divine identity. Ignoring them can cause penalties or Dissonance.</p>
<p>Check the Mandates section of the Quests screen whenever you are unsure what your adopted Aspects currently expect from you.</p>
</div><div class="hub-textbox">
<h2>Camp Works & Crafting</h2>
<p>Crafting and Camp Works are separate systems.</p>
<p>Both use materials, but they serve different purposes:</p>
<ul>
<li>Crafting creates items and equipment.</li>
<li>Camp Works creates specialised structures and maintained spaces around the camp that provide lasting benefits.</li>
</ul>
<p>You can access Crafting from the Chieftain's Tent view and Camp Works from The Camp view.</p>
<h3>Crafting</h3>
<p>Open: Chieftain's Tent -> Crafting</p>
<p>The Crafting screen shows your available recipes on the left and the selected recipe's requirements and result on the right.</p>
<p>Recipes are divided into categories to make them easier to browse.</p>
<h3>Crafting Requirements</h3>
<p>Most recipes require specific materials or items.</p>
<p>The recipe panel shows:</p>
<ul>
<li>what ingredients are required;</li>
<li>how many you currently own;</li>
<li>any terrain requirement;</li>
<li>the item that will be produced;</li>
<li>any effects or bonuses the finished item provides.</li>
</ul>
<p>If a requirement is not met, the recipe cannot be crafted.</p>
<h3>Terrain and Crafting</h3>
<p>Some recipes interact with the terrain your camp is currently standing on.</p>
<p>There are two types:</p>
<p>Required Terrain means the item can only be crafted while your camp is on the listed terrain.</p>
<p>Preferred Terrain means the item can still be crafted elsewhere, but crafting it on the preferred terrain reduces its ingredient costs by 50%.</p>
<p>This can make migration useful even if you are not moving purely for Food or Resources.</p>
<h3>Crafted Items</h3>
<p>Crafted items are added to your Inventory.</p>
<p>Depending on the item, they may be:</p>
<ul>
<li>equipped;</li>
<li>consumed;</li>
<li>used as materials for other systems;</li>
<li>required for Camp Works;</li>
<li>used during events or quests.</li>
</ul>
<p>For equipment, open Character -> Inventory to inspect and equip it.</p>
<h3>Camp Works</h3>
<p>Open: The Camp -> Camp Works</p>
<p>Camp Works are structures and specialised spaces your tribe establishes around its current camp.</p>
<p>Each Work occupies one available Site and provides an ongoing benefit once construction is complete.</p>
<p>Examples include production buildings, military areas, religious structures, storage, defenses, and gathering spaces.</p>
<h3>Available Sites</h3>
<p>There are up to four Camp Work Sites, but your tribe may not have access to all of them.</p>
<p>The number of available Sites depends mainly on your Camp Way Tradition.</p>
<p>More mobile camps have fewer usable Sites, while more settled camps can support more permanent development.</p>
<p>If your Camp Way changes, the number of usable Sites can change with it.</p>
<h3>Building a Camp Work</h3>
<p>Select an empty Site to see the Camp Works that can be built there.</p>
<p>Each Work can have:</p>
<ul>
<li>a Resource cost;</li>
<li>required crafted materials;</li>
<li>a construction time;</li>
<li>a Tradition requirement;</li>
<li>an ongoing effect;</li>
<li>an operating cost.</li>
</ul>
<p>The build screen shows these before you commit.</p>
<p>Construction takes several turns rather than finishing immediately.</p>
<h3>Construction Cost</h3>
<p>Camp Works usually require large amounts of Resources as well as specific crafted materials.</p>
<p>Higher Stewardship can reduce the Resource portion of construction costs.</p>
<p>The crafted-item requirements themselves are still paid separately.</p>
<h3>Construction Time</h3>
<p>Each Camp Work has a base construction time.</p>
<p>That time can be modified by:</p>
<ul>
<li>your Camp Way Tradition;</li>
<li>other relevant bonuses or penalties;</li>
<li>the Works Keeper Camp Position.</li>
</ul>
<p>More settled Camp Way stages generally build faster, while strongly mobile camps take longer to establish large structures.</p>
<h3>Works Keeper</h3>
<p>The Works Keeper is a Camp Position focused on construction.</p>
<p>A capable Works Keeper can reduce the number of turns needed to build Camp Works.</p>
<p>Their aptitude is based mainly on Stewardship, with Leadership also contributing.</p>
<h3>Tradition Requirements</h3>
<p>Some Camp Works only become available once your tribe has developed particular Traditions.</p>
<p>For example, certain structures may require a more Ordered, Rooted, warlike, religious, or otherwise specialised society.</p>
<p>If a Camp Work is unavailable, the build screen shows the requirement you are missing.</p>
<h3>Operating Costs</h3>
<p>Some Camp Works require resources to remain active.</p>
<p>If their operating cost cannot be paid, the structure may stop providing its normal benefit until the requirement is met again.</p>
<p>Not every Camp Work has the same type of upkeep.</p>
<h3>Replacing a Camp Work</h3>
<p>An existing Camp Work can be replaced with another valid structure.</p>
<p>Replacing it removes the old structure and begins construction of the new one.</p>
<p>Materials from the old Camp Work are not recovered.</p>
<h3>Migration and Camp Works</h3>
<p>Camp Works are not permanently lost when you migrate.</p>
<p>Instead, they represent structures, routines, and specialised spaces that your tribe knows how to establish. After moving, completed Camp Works must be re-established at the new camp before they become active again.</p>
<p>Your Camp Way Tradition changes how this works.</p>
<p>More Sedentary tribes can support more Camp Work Sites and generally construct permanent camp infrastructure more efficiently.</p>
<p>More Migratory tribes support fewer Sites, but they are better at packing up, moving, and getting their existing Camp Works running again quickly after migration.</p>
<p>This means both approaches are viable:</p>
<ul>
<li>a settled tribe can maintain a larger and more developed camp;</li>
<li>a mobile tribe can recover from relocation much faster.</li>
</ul>
<p>The Camp Works screen shows both your current number of available Sites and your current Migration Recovery time.</p>
</div><div class="hub-textbox">
<h2>Events</h2>
<p>Events are one of the main ways the game reacts to your current situation.</p>
<p>They can represent problems, opportunities, conversations, changes in the tribe, consequences from earlier choices, or developments in the wider region.</p>
<p>Some resolve quickly. Others can become larger story sequences.</p>
<h3>Normal Events</h3>
<p>Normal Events are small random incidents that happen around the tribe.</p>
<p>They usually require little or no input from you. Most simply report something that happened and apply the result.</p>
<p>Examples include:</p>
<ul>
<li>a tribesman dying during a hunt, reducing Population;</li>
<li>a minor incident raising or lowering Stability or Zeal;</li>
<li>a follower trait producing a small benefit or penalty;</li>
<li>a timed quest failing and applying its consequences;</li>
<li>other background changes caused by the current state of the tribe.</li>
</ul>
<p>Normal Events can still reflect important earlier choices, traits, quests, or conditions. They are often used to show the consequences of those systems.</p>
<p>However, they are usually not major decision points themselves. They are primarily a way for the game to resolve smaller random happenings and deliver mechanical consequences before returning you to normal play.</p>
<h3>Major Events</h3>
<p>Major Events are larger situations that temporarily interrupt normal gameplay.</p>
<p>They can include:</p>
<ul>
<li>important story developments;</li>
<li>major conflicts;</li>
<li>raids;</li>
<li>serious tribe-wide problems;</li>
<li>multi-step choices;</li>
<li>events with lasting consequences.</li>
</ul>
<p>While a Major Event is active, some normal Hub actions may be unavailable until the situation has been resolved.</p>
<h3>Story Events</h3>
<p>Some events are tied directly to the main story or a specific quest.</p>
<p>These may happen:</p>
<ul>
<li>after a particular number of turns;</li>
<li>after completing another objective;</li>
<li>when you reach a particular location;</li>
<li>after making a specific choice;</li>
<li>when another required condition becomes true.</li>
</ul>
<p>Story events are generally more controlled than ordinary random events.</p>
<h3>When Events Happen</h3>
<p>Many events are checked when you End Turn.</p>
<p>The game can use your current situation to decide which events are eligible.</p>
<p>This can include values such as:</p>
<ul>
<li>Food;</li>
<li>Population;</li>
<li>Stability;</li>
<li>Zeal;</li>
<li>Raid Chance;</li>
<li>Terrain;</li>
<li>local Game or Resources;</li>
<li>other tribes;</li>
<li>active quests;</li>
<li>Traditions;</li>
<li>earlier choices.</li>
</ul>
<p>Events are primarily processed around the end of individual turns, not only once every four-turn Season.</p>
<h3>Conditions and Thresholds</h3>
<p>Some events only become possible when a value reaches a particular range.</p>
<p>For example, an event might require:</p>
<ul>
<li>low Food;</li>
<li>high or low Stability;</li>
<li>a large Population;</li>
<li>a particular Tradition;</li>
<li>a certain relationship;</li>
<li>a specific tribe nearby.</li>
</ul>
<p>This means changing the state of your tribe can also change which events are able to appear.</p>
<h3>Events Can Follow Earlier Choices</h3>
<p>Some decisions do not produce their full consequence immediately.</p>
<p>An action may instead:</p>
<ul>
<li>unlock an event several turns later;</li>
<li>change the version of a later event;</li>
<li>prevent another event from happening;</li>
<li>make a future outcome better or worse.</li>
</ul>
<p>The game keeps track of many earlier decisions in the background.</p>
<h3>Events and Quests</h3>
<p>Events can:</p>
<ul>
<li>begin a new Quest;</li>
<li>advance an existing Quest;</li>
<li>change its objective;</li>
<li>complete it;</li>
<li>create a new map location or Expedition.</li>
</ul>
<p>If an event gives you a new objective, check the Quests screen afterward.</p>
<h3>Events and the Current Tile</h3>
<p>Your current camp location can influence what happens.</p>
<p>Terrain, Game, Resources, special tile features, nearby tribes, and quest markers can all affect which events are available.</p>
<p>Migration can therefore change more than just your passive economy.</p>
<h3>Choices and Stat Checks</h3>
<p>Events often give several ways to respond.</p>
<p>Some options may:</p>
<ul>
<li>always be available;</li>
<li>require a Stat Check;</li>
<li>require a Power;</li>
<li>require a particular item;</li>
<li>depend on a relationship or Tradition;</li>
<li>cost Belief or resources;</li>
<li>only exist because of an earlier choice.</li>
</ul>
<p>A choice being available does not always mean it is safe.</p>
<p>Read the option and any displayed requirements before committing.</p>
<h3>Event Results</h3>
<p>After an important decision, the game may show a result screen summarising what changed.</p>
<p>This can include:</p>
<ul>
<li>successful or failed checks;</li>
<li>resource changes;</li>
<li>Population losses or gains;</li>
<li>Stability and Zeal changes;</li>
<li>relationship effects;</li>
<li>quest progress;</li>
<li>combat or raid results.</li>
</ul>
<p>These screens are meant to make the mechanical outcome clear even when the accompanying story text is more descriptive.</p>
</div><div class="hub-textbox">
<h2>Hub & Turns</h2>
<p>The Hub is the main screen you return to between most actions and events.</p>
<p>From here you can review your character, check the state of the tribe, choose actions, and end the current turn.</p>
<h3>Chieftain's Tent and The Camp</h3>
<p>The center of the Hub has two views:</p>
<p>Chieftain's Tent focuses on matters brought directly to you as chieftain.</p>
<p>The Camp focuses more on everyday camp life and development.</p>
<p>You can switch between them at any time while on the Hub. Some action buttons also change depending on which view is active.</p>
<p>For example:</p>
<ul>
<li>Crafting is available from the Chieftain's Tent.</li>
<li>Camp Works is available from The Camp.</li>
</ul>
<p>Most other Hub actions remain available from either view.</p>
<h3>Status Panel</h3>
<p>The right side of the Hub shows your current Status.</p>
<p>This includes:</p>
<ul>
<li>Belief;</li>
<li>your six main stats;</li>
<li>available Action Points;</li>
<li>the End Turn button.</li>
</ul>
<p>Action Points are refreshed at the start of each new turn.</p>
<p>For more information about your stats, see Stats & Checks.</p>
<p>For Belief and supernatural progression, see Belief, Aspects & Powers.</p>
<h3>Camp Overview</h3>
<p>The lower-left section tracks the current state of your tribe.</p>
<p>This includes:</p>
<ul>
<li>Population</li>
<li>Military</li>
<li>Food</li>
<li>Resources</li>
<li>Goods</li>
<li>Stability</li>
<li>Zeal</li>
<li>active Conditions</li>
</ul>
<p>Many values have tooltips that give additional information about where the current number is coming from.</p>
<h3>World Overview</h3>
<p>The lower-right section describes your current location and the state of the world around it.</p>
<p>It shows things such as:</p>
<ul>
<li>the current Season;</li>
<li>progress through that Season;</li>
<li>Terrain;</li>
<li>local Game;</li>
<li>local Resources;</li>
<li>Raid Chance.</li>
</ul>
<p>These values can affect food production, gathering, events, raids, migration, and other systems.</p>
<h3>Turns and Seasons</h3>
<p>A turn is the basic unit of gameplay.</p>
<p>During a turn, you can spend Action Points on Season Plans, Rituals, Expeditions, and other actions.</p>
<p>When you are finished, press End Turn.</p>
<p>Ending the turn resolves the tribe's current plans and economy, advances ongoing effects, and may trigger events.</p>
<p>A Season lasts four turns.</p>
<p>The current Season can change food production, upkeep, hunting, terrain conditions, and other effects.</p>
<h3>End Turn</h3>
<p>Pressing End Turn commits the current turn.</p>
<p>Before doing so, it is usually worth checking:</p>
<ul>
<li>whether you still have Action Points you want to spend;</li>
<li>whether your Season Plans are correct;</li>
<li>whether any important action or quest needs attention.</li>
</ul>
<p>Some story events or mandatory actions can temporarily prevent you from ending the turn until they are resolved.</p>
<h3>Core Actions and World Actions</h3>
<p>The lower-right menu is split into different groups.</p>
<p>Core Actions contain frequently used personal and tracking screens such as Quests, Character, Relationships, and Inventory.</p>
<p>World Actions contain larger tribe or regional systems such as Federation, Traditions, and the Map.</p>
<p>Use the arrow buttons to switch between these groups.</p>
</div><div class="hub-textbox">
<h2>Map & Migration</h2>
<p>The Map shows the region around your tribe.</p>
<p>You can open it from: World Actions -> Map</p>
<p>The map tracks your current camp, explored terrain, quest locations, other tribes, and special locations you have discovered.</p>
<h3>Tiles</h3>
<p>The world is divided into tiles.</p>
<p>Each tile can have information such as:</p>
<ul>
<li>Terrain</li>
<li>Game</li>
<li>Resources</li>
<li>special features;</li>
<li>quests;</li>
<li>tribe camps.</li>
</ul>
<p>Your current tile directly affects several parts of the tribe's economy and what events or opportunities are available.</p>
<h3>Terrain</h3>
<p>Terrain is the basic land type of the tile.</p>
<p>It can affect:</p>
<ul>
<li>events;</li>
<li>crafting;</li>
<li>Camp Works;</li>
<li>movement;</li>
<li>available resources;</li>
<li>other special systems.</li>
</ul>
<p>Some actions or recipes require specific terrain.</p>
<h3>Game</h3>
<p>Game represents how useful the area is for hunting and feeding the tribe.</p>
<p>Higher Game generally improves passive Food production and makes hunting more effective.</p>
<p>The current Season and other modifiers can change how valuable that Game is.</p>
<h3>Resources</h3>
<p>The tile's Resources value represents how useful the area is for gathering common materials.</p>
<p>Higher values improve passive Resource production and can make resource-focused actions more effective.</p>
<h3>Exploring the Map</h3>
<p>Not every tile begins fully known.</p>
<p>Scouting, migration, quests, and other actions can reveal more of the surrounding region.</p>
<p>Exploration can uncover:</p>
<ul>
<li>better land;</li>
<li>other tribes;</li>
<li>quest locations;</li>
<li>special terrain features;</li>
<li>dangerous areas.</li>
</ul>
<h3>Moving the Camp</h3>
<p>Normal movement begins with the Relocate Camp Season Plan.</p>
<p>The sequence is:</p>
<ol>
<li>Open Season Plan.</li>
<li>Select Relocate Camp.</li>
<li>End the turn.</li>
<li>The Migration screen opens.</li>
<li>Select a reachable tile.</li>
<li>Choose Migrate here.</li>
<li>Confirm the destination.</li>
</ol>
<p>The camp then moves to that tile.</p>
<h3>Reachable Tiles</h3>
<p>During Migration, valid destinations are highlighted.</p>
<p>Under normal migration, you can only move within the allowed range around your current camp.</p>
<p>You cannot settle:</p>
<ul>
<li>on your current tile;</li>
<li>on forbidden land;</li>
<li>on a tile occupied by another tribe's camp;</li>
<li>beyond your current movement range.</li>
</ul>
<p>The Migration screen shows whether a selected tile is reachable or blocked.</p>
<h3>Long March</h3>
<p>Long March allows the tribe to travel farther in a single migration.</p>
<p>It costs additional Food and Resources.</p>
<p>The exact cost and extra distance can be modified by your Camp Way Tradition.</p>
<p>The Migration screen shows the current cost before you select it.</p>
<p>Strongly mobile societies can make Long March cheaper or travel farther, while a Sedentary tribe can lose access to Long March entirely.</p>
<h3>Migration and Camp Way</h3>
<p>Moving the tribe also affects the Camp Way Tradition.</p>
<p>Normal migration pushes the tribe toward the mobile side of that Tradition, while a Long March causes a stronger push.</p>
<p>Repeatedly remaining in one place can instead move the tribe toward more settled customs.</p>
<h3>Migration and Camp Works</h3>
<p>Migration does not permanently destroy completed Camp Works, but it temporarily disrupts them.</p>
<p>After moving, they need time to be re-established before they become active again.</p>
<p>More mobile Camp Way stages recover faster, while more settled stages generally take longer.</p>
<p>For more information, see Camp Works & Crafting.</p>
<h3>Quests and the Map</h3>
<p>Many quests are tied to a specific tile.</p>
<p>A quest marker tells you where the relevant objective is located.</p>
<p>Reaching the marked tile does not always complete the quest by itself. In many cases, arriving there enables the Expedition button on the Hub.</p>
<p>For more information, see Quests & Expeditions.</p>
</div><div class="hub-textbox">
<h2>Military & Raids</h2>
<p>Military Strength represents the overall fighting capability of a tribe.</p>
<p>It is useful for comparing tribes and influences warfare, but actual raids are fought using individual Warbands with their own combat statistics.</p>
<h3>Military Strength</h3>
<p>Your tribe's Military Strength, or Mil Str, is a broad estimate of its ability to fight.</p>
<p>Population is one of its main foundations because a larger tribe can support more fighters.</p>
<p>Other factors can also improve or reduce Military Strength, including:</p>
<ul>
<li>Resources and equipment;</li>
<li>military training;</li>
<li>Leadership;</li>
<li>Zeal;</li>
<li>Camp Works;</li>
<li>temporary effects;</li>
<li>other bonuses or penalties.</li>
</ul>
<p>Military Strength is not simply a weapon score. It represents the tribe's wider ability to field an effective fighting force.</p>
<h3>Raid Chance</h3>
<p>Raid Chance represents the current danger of another tribe attacking your camp.</p>
<p>It can rise when nearby tribes:</p>
<ul>
<li>are hostile toward you;</li>
<li>have poor Relations with you;</li>
<li>are in an aggressive Mood;</li>
<li>have a temperament that favours aggression;</li>
<li>believe they are strong enough to attack;</li>
<li>see your camp as a worthwhile target.</li>
</ul>
<p>Higher Raid Chance means hostile raid events are more likely to occur.</p>
<h3>Attacking and Defending</h3>
<p>Raid combat can begin because:</p>
<ul>
<li>you choose Raid against another tribe;</li>
<li>another tribe attacks your camp;</li>
<li>a story or Federation event begins a battle.</li>
</ul>
<p>When you attack, you usually decide how much of your available force to Commit before the battle.</p>
<p>More committed warriors give you more Warbands and fighting strength, but also place more of your Population at risk.</p>
<p>Defensive battles instead use the forces available to protect your camp and can be affected by prior defensive preparation.</p>
<h3>Warbands</h3>
<p>Armies are divided into Warbands.</p>
<p>A battle can place Warbands across up to three lanes:</p>
<p>Left - Center - Right</p>
<p>Each lane represents a separate part of the battlefront.</p>
<p>A Warband normally fights the enemy occupying the opposing side of its lane.</p>
<p>Some terrain can close particular fronts, meaning one side cannot place or move a Warband into that lane.</p>
<h3>Warband Statistics</h3>
<p>Each Warband has four important values.</p>
<p>HP represents its physical fighting strength and casualties. If HP reaches 0, the Warband breaks.</p>
<p>Morale represents courage and willingness to keep fighting. A Warband can break from reaching 0 Morale even if it still has fighters remaining.</p>
<p>ATK determines how effectively the Warband can inflict damage and pressure on its opponent.</p>
<p>DEF helps the Warband resist enemy attacks and hold its position.</p>
<h3>Army Resolve</h3>
<p>Resolve represents the willingness of the entire army to continue fighting.</p>
<p>This is separate from the Morale of individual Warbands.</p>
<p>Breaking enemy Warbands and gaining advantages during the battle can reduce the opposing army's Resolve.</p>
<p>If a side's Resolve reaches 0, that army breaks and loses the battle.</p>
<p>You therefore do not necessarily need to destroy every enemy Warband to win.</p>
<h3>Battle Rounds</h3>
<p>Raid combat is divided into Rounds.</p>
<p>At the beginning of each round you receive Command Points, or CP.</p>
<p>CP are spent issuing orders and performing certain battlefield actions.</p>
<p>Most commands cost 1 CP.</p>
<p>Unused CP do not carry into the next round. When you press End Round, any remaining CP are discarded and the fighting is resolved.</p>
<h3>Selecting a Lane</h3>
<p>Before issuing an order, select the lane you want to affect.</p>
<p>Your command applies to the Selected Lane.</p>
<p>The battle screen displays the Warband currently occupying each lane along with its HP, Morale, ATK, DEF, Focus, and any active bonuses.</p>
<h3>Push, Hold, and Rally</h3>
<p>The three basic battlefield orders are:</p>
<p>Push - an aggressive order. The Warband gains ATK but sacrifices some DEF.</p>
<p>Hold - a defensive order. The Warband gains DEF and a small Morale benefit.</p>
<p>Rally - a recovery order. The Warband gains some DEF and restores Morale based on Leadership.</p>
<p>These commands also counter one another:</p>
<p>Push beats Rally.</p>
<p>Hold beats Push.</p>
<p>Rally beats Hold.</p>
<p>This means the enemy's planned order can matter as much as the raw statistics of the Warbands.</p>
<h3>Enemy Plans</h3>
<p>Enemy Warbands choose their own orders each round.</p>
<p>Their plan is not always immediately visible.</p>
<p>In some situations, you can spend battlefield resources or use abilities to determine what an enemy Warband intends to do before choosing your own response.</p>
<p>A revealed enemy plan can help you choose the appropriate counter.</p>
<h3>Momentum</h3>
<p>Winning the tactical exchange in a lane can create Momentum.</p>
<p>Momentum represents one side gaining the initiative and pressing an advantage on that part of the battlefield.</p>
<p>The current Momentum and its effect are shown on the relevant lane.</p>
<p>Momentum belongs to the side currently controlling that advantage and can influence later fighting in the lane.</p>
<h3>Leader Focus</h3>
<p>Your army's leader focuses on one lane at a time.</p>
<p>The Leader Focus lane receives the leader bonus shown on the battle screen.</p>
<p>You can spend CP to move Leader Focus to another lane, although this can normally only be done once per round.</p>
<p>Leader Focus and the currently Selected Lane are different:</p>
<p>Selected Lane determines where your next command goes.</p>
<p>Leader Focus determines where your leader's bonus applies.</p>
<h3>Warband Focus</h3>
<p>A Warband's Focus shows which opposing lane or target it intends to pressure when the round resolves.</p>
<p>This is separate from the player's Selected Lane and Leader Focus.</p>
<p>Check the arrows and Focus labels on the battlefield when you need to understand which Warband is attacking where.</p>
<h3>Moving Warbands</h3>
<p>Warbands can be repositioned during battle.</p>
<p>You can spend CP to move a Warband left or right when:</p>
<ul>
<li>the destination lane is open;</li>
<li>terrain does not block it;</li>
<li>another friendly Warband is not already occupying it.</li>
</ul>
<p>Repositioning lets you react to empty fronts, dangerous matchups, or broken Warbands.</p>
<h3>Reserves</h3>
<p>Warbands that are committed to the battle but are not currently on the frontline are kept in Reserve.</p>
<p>If an open lane is empty, you can spend 1 CP to deploy the next available Reserve into it.</p>
<p>Reserves are especially important after a frontline Warband breaks.</p>
<h3>Battle Powers</h3>
<p>Some acquired Powers can be used directly during raids.</p>
<p>Open the Powers tab on the battle screen to see what is currently available.</p>
<p>Battle Powers can have requirements such as:</p>
<ul>
<li>sufficient Belief;</li>
<li>a friendly Warband in the selected lane;</li>
<li>Leader Focus being on that lane;</li>
<li>a valid target or battlefield situation.</li>
</ul>
<p>Some affect a particular lane, while others can influence the wider battle.</p>
<p>For information about acquiring Powers, see Belief, Aspects & Powers.</p>
<h3>Ending a Round</h3>
<p>Once you have issued the commands you want, press End Round.</p>
<p>The enemy completes its own decisions and the fighting across all active lanes resolves.</p>
<p>You do not have to spend every CP before ending the round, but unused CP are lost.</p>
<p>The next round then begins if neither army has broken.</p>
<h3>Withdrawing</h3>
<p>You can sometimes choose Withdraw instead of continuing the battle.</p>
<p>When attacking, withdrawing ends your raid without achieving a normal victory.</p>
<p>When defending, abandoning the camp can carry more serious consequences, including losses of stock and Population depending on how badly your forces have already been damaged.</p>
<p>Some circumstances may prevent withdrawal.</p>
<h3>Winning and Losing</h3>
<p>The main goal is to break the opposing army's Resolve before your own reaches 0.</p>
<p>Individual Warbands can also break because their HP or Morale reaches 0.</p>
<p>The final outcome can affect:</p>
<ul>
<li>Population;</li>
<li>Food, Resources, and Goods;</li>
<li>captives;</li>
<li>Stability;</li>
<li>Zeal;</li>
<li>Relations;</li>
<li>quests and story progress;</li>
<li>other tribe or campaign systems.</li>
</ul>
<p>The exact consequences depend on why the battle was fought and whether you were attacking or defending.</p>
</div><div class="hub-textbox">
<h2>Other Tribes & Federation</h2>
<p>Once your tribe discovers other peoples in the region, you can interact with them through Other Tribes.</p>
<p>Each tribe has its own strength, personality, opinion of you, and current circumstances. These affect how it responds to diplomacy, trade, threats, and war.</p>
<h3>Tribe Information</h3>
<p>Select a known tribe from Other Tribes to open its information screen.</p>
<p>This shows important information such as:</p>
<ul>
<li>Relations</li>
<li>Temperament</li>
<li>Mood</li>
<li>Population</li>
<li>Resources</li>
<li>Military Strength</li>
<li>the tribe's leader;</li>
<li>any known Traits.</li>
</ul>
<p>The available actions are divided into Friendly and Hostile options.</p>
<h3>Relations</h3>
<p>Relations represent the tribe's long-term opinion of your people.</p>
<p>Higher Relations generally make peaceful diplomacy easier and improve access to cooperative outcomes.</p>
<p>Low Relations make hostility, refusals, and conflict more likely.</p>
<p>Actions such as visiting, trading, diplomacy, threats, raids, and Federation decisions can all change Relations.</p>
<h3>Temperament</h3>
<p>Temperament represents a tribe's general personality and long-term behavioural tendency.</p>
<p>For example, one tribe may naturally be more aggressive while another is more receptive to trade or cooperation.</p>
<p>Temperament normally changes far less readily than Mood. It affects how the tribe evaluates different diplomatic situations and what kinds of behaviour come naturally to it.</p>
<h3>Mood</h3>
<p>Mood represents a tribe's more immediate emotional state.</p>
<p>Unlike Temperament, Mood can change relatively quickly because of recent events or interactions.</p>
<p>A tribe may temporarily become more hostile, fearful, grateful, confident, or otherwise affected by what has recently happened.</p>
<p>Think of them as:</p>
<p>Temperament = what this tribe is generally like.</p>
<p>Mood = how this tribe currently feels.</p>
<h3>Reaching Other Tribes</h3>
<p>Knowing that a tribe exists does not always mean you can directly interact with it.</p>
<p>Many diplomatic and hostile actions require the tribe to be within interaction range of your current camp.</p>
<p>If an action is disabled because the tribe cannot currently be reached, moving your camp closer may make direct interaction possible.</p>
<h3>Friendly Actions</h3>
<p>Friendly actions are used for diplomacy, cooperation, and trade.</p>
<p>Depending on the tribe and current circumstances, these can include:</p>
<p>Visit - meet with the tribe and attempt to improve Relations. A tribe can normally only be visited once per turn.</p>
<p>Knowledge Share - ask a friendly tribe for useful information about the surrounding region. Successful knowledge sharing can reveal a temporary lead or quest on the Map.</p>
<p>Trade - exchange resources and goods. The value and result of a trade can depend on the tribe and the approach you take.</p>
<p>Peace Oath - attempt to establish a temporary agreement preventing raids and tribute between your tribes.</p>
<p>Bind Tribe - invite the tribe to join your Federation.</p>
<p>Some actions require good enough Relations or other conditions before the tribe is willing to accept.</p>
<h3>Hostile Actions</h3>
<p>The Hostile tab contains coercive or openly aggressive actions.</p>
<p>These can include:</p>
<p>Force Migration - pressure another tribe into abandoning its current camp and relocating.</p>
<p>Tribute - demand payment under threat of force.</p>
<p>Infiltrate - use the Ghost Walk Power to secretly prepare against a tribe before a raid.</p>
<p>Raid - attack the tribe directly and enter the raid combat system.</p>
<p>Hostile actions usually damage Relations and can have consequences beyond their immediate reward.</p>
<p>Peace agreements and Federation membership can also prevent some hostile actions.</p>
<h3>Peace Oaths</h3>
<p>A Peace Oath temporarily prevents the participating tribes from raiding or demanding tribute from one another.</p>
<p>The tribe screen shows how many turns remain while an oath is active.</p>
<p>Federation members do not need a separate Peace Oath with one another because Federation membership already serves as a non-aggression agreement.</p>
<h3>Federation</h3>
<p>A Federation is an alliance of separate tribes.</p>
<p>The tribes do not merge into one Population or cease to exist independently. They keep their own camps, leaders, Resources, Military Strength, Relations, Temperament, and Mood.</p>
<p>The Federation instead creates a shared political and military pact between them.</p>
<h3>Forming a Federation</h3>
<p>If you do not yet have a Federation, use Bind Tribe on a suitable tribe.</p>
<p>Successfully binding the first tribe establishes the Federation.</p>
<p>Additional tribes can later be invited into the same alliance.</p>
<p>Once formed, open: World Actions -> Federation</p>
<p>to manage it.</p>
<h3>Federation Members</h3>
<p>The Federation screen lists each member and shows information including:</p>
<ul>
<li>Relations;</li>
<li>Temperament;</li>
<li>Mood;</li>
<li>Military Strength.</li>
</ul>
<p>Relations still matter after a tribe joins.</p>
<p>A tribe being your ally does not mean it will automatically agree with everything you do.</p>
<h3>Cohesion</h3>
<p>Cohesion represents how strongly the Federation's members trust and support the shared alliance.</p>
<p>Higher Cohesion makes the Federation healthier and allows it to support more development.</p>
<p>Low Cohesion means the alliance is becoming strained. If Cohesion falls too far, dissatisfied tribes can begin leaving the Federation.</p>
<p>The Federation screen displays both:</p>
<p>Current Cohesion - how stable the Federation is now.</p>
<p>Target Cohesion - the value Current Cohesion tends toward.</p>
<p>Relations between members and other Federation conditions can affect that target.</p>
<h3>Federation Events</h3>
<p>Federation members can create new events and obligations.</p>
<p>For example, a member may:</p>
<ul>
<li>ask for military aid;</li>
<li>propose or begin a raid;</li>
<li>request protection for trade;</li>
<li>complain that another member is not contributing enough;</li>
<li>offer gifts when relations are particularly good.</li>
</ul>
<p>How you respond can affect both your Relations with individual tribes and the Federation's Cohesion.</p>
<p>Refusing to support an ally when the Federation expects cooperation can therefore damage more than just that one relationship.</p>
<h3>Federation Reforms</h3>
<p>A developed Federation can adopt Reforms.</p>
<p>Reforms provide lasting bonuses or change how the Federation operates.</p>
<p>Each Reform can have:</p>
<ul>
<li>a minimum Cohesion requirement;</li>
<li>a Cohesion cost;</li>
<li>prerequisite Reforms;</li>
<li>an exclusive alternative;</li>
<li>different reactions from member tribes.</li>
</ul>
<p>Some Reform choices close off another path, so check the preview before adopting one.</p>
<p>Cohesion is therefore both a measure of Federation stability and a resource used to develop the alliance.</p>
</div><div class="hub-textbox">
<h2>Quests & Expeditions</h2>
<p>Quests track ongoing objectives, storylines, and opportunities.</p>
<p>Open: Core Actions -> Quests</p>
<p>The Quests screen tells you what is currently active and what the game expects you to do next.</p>
<h3>Quest Objectives</h3>
<p>Each quest can have an objective describing its current step.</p>
<p>Objectives may ask you to:</p>
<ul>
<li>talk to someone;</li>
<li>make a decision;</li>
<li>complete a Season Plan;</li>
<li>reach a map tile;</li>
<li>perform an Expedition;</li>
<li>wait for an event;</li>
<li>complete another requirement.</li>
</ul>
<p>If you are unsure how to continue a storyline, check its current objective first.</p>
<h3>Quest Locations</h3>
<p>Some quests are tied to a specific map tile.</p>
<p>These quests can show a marker on the Map once their location is known.</p>
<p>If the objective is somewhere else, you may need to relocate the tribe before you can continue.</p>
<h3>Tracking Quests</h3>
<p>Quest tracking lets you mark objectives you want to keep an eye on.</p>
<p>Tracked quests can be shown more prominently in other parts of the interface, including relevant map information.</p>
<p>Tracking a quest does not change its mechanics. It only makes it easier to follow.</p>
<h3>Expeditions</h3>
<p>Expeditions are used to actively investigate quests and opportunities located where your camp currently stands.</p>
<p>The Expedition button is on the Hub.</p>
<p>It becomes available when:</p>
<ul>
<li>there is an active quest on your current tile;</li>
<li>you have at least 1 Action Point available.</li>
</ul>
<p>If either condition is not met, the Expedition button is disabled.</p>
<h3>Why Is Expedition Disabled?</h3>
<p>If you expect an Expedition to be available, check:</p>
<ol>
<li>Is the quest still active?</li>
<li>Does the quest's target match your current camp tile?</li>
<li>Do you have at least 1 Action Point?</li>
</ol>
<p>If the quest is somewhere else, use the Map to find its marker and migrate there if necessary.</p>
<h3>Starting an Expedition</h3>
<p>When one Expedition is available at your current location, pressing Expedition takes you directly into that quest.</p>
<p>If several Expeditions are available on the same tile, you will be asked which one you want to pursue.</p>
<p>The quest itself handles whatever decisions, checks, combat, or outcomes are involved.</p>
<h3>Expedition Costs</h3>
<p>Starting an Expedition requires at least 1 Action Point under the current system.</p>
<p>Individual quests may also involve additional costs, checks, or risks once the Expedition begins.</p>
<p>It is therefore worth checking your available AP before spending everything elsewhere during a turn.</p>
<h3>Quests Can Change</h3>
<p>A quest can update its objective as you progress.</p>
<p>For example, one stage might ask you to reach a location, while the next stage asks you to use Expedition once you arrive.</p>
<p>Always check the current objective rather than assuming the original task is still the active one.</p>
<h3>Story and Mandatory Quests</h3>
<p>Some quests are part of the main story and may temporarily restrict normal progression until their current step is completed.</p>
<p>This is intentional.</p>
<p>If End Turn or another action is temporarily unavailable, check your active Quests and any message shown on the Hub for the required next step.</p>
<h3>Aspect Mandates</h3>
<p>The Quests screen also contains Aspect Mandates once they become relevant.</p>
<p>Mandates are separate from normal quests. They are recurring requirements connected to your adopted Aspects.</p>
<p>For details, see Belief, Aspects & Powers.</p>
</div><div class="hub-textbox">
<h2>Season Plans & Action Points</h2>
<p>Season Plans are one of the main ways you tell the tribe what to focus on during a turn.</p>
<p>You can open them from the Season Plan button on the Hub.</p>
<h3>Action Points</h3>
<p>Most Season Plans cost Action Points.</p>
<p>Your available Action Points are shown in the Status panel.</p>
<p>Action Points refresh each turn.</p>
<p>You can select multiple Season Plans in the same turn as long as you can afford their combined Action Point and resource costs.</p>
<p>This means Season Plans are not a single choice or "main focus." They are a set of actions that can be combined.</p>
<h3>Selecting Plans</h3>
<p>Click a Season Plan to select it.</p>
<p>Its costs are paid when it is selected.</p>
<p>If you deselect it before ending the turn, those selection costs are refunded.</p>
<p>The Current Commitment section shows the total cost of everything currently selected, making it easier to check your choices before returning to the Hub.</p>
<h3>Types of Season Plans</h3>
<p>Season Plans are divided into broad groups such as:</p>
<p>Survival - Food, gathering, growth, and similar needs.</p>
<p>Tribe - social organisation, councils, and other tribe-wide development.</p>
<p>Exploration - scouting, finding other tribes, and relocation.</p>
<p>Security - training, fortification, concealment, and other defensive preparation.</p>
<p>Not every plan is always available. Some require particular conditions, resources, Traditions, story progress, or other prerequisites.</p>
<h3>Immediate and Ongoing Effects</h3>
<p>Not every Season Plan works in the same way.</p>
<p>Some produce an immediate effect when the turn resolves.</p>
<p>Others create a temporary effect that lasts for several turns.</p>
<p>For example, Hunt Game increases Food production for a limited period rather than simply giving one fixed pile of Food, while Gather Resources can temporarily improve material gathering.</p>
<p>Hover over a Season Plan to see its current effect and requirements.</p>
<h3>Relocate Camp</h3>
<p>Relocate Camp prepares the tribe to move to a different tile.</p>
<p>Selecting it does not immediately move the camp.</p>
<p>Instead:</p>
<ol>
<li>Select Relocate Camp in Season Plan.</li>
<li>End the turn.</li>
<li>The game opens the Migration screen.</li>
<li>Choose the new location.</li>
</ol>
<p>Relocation costs 2 Action Points under the normal rules.</p>
<p>Moving also removes your current Camp Fortification and can affect Camp Works and Traditions.</p>
<p>For more information, see Map & Migration.</p>
<h3>Auto-repeat</h3>
<p>Auto-repeat remembers the Season Plans you selected on the previous turn and tries to select the same set again at the start of the next turn.</p>
<p>It only repeats them if you can still afford their full costs and they are still available.</p>
<p>Auto-repeat can fail if:</p>
<ul>
<li>you do not have enough Action Points;</li>
<li>you do not have enough Food or Resources;</li>
<li>one of the saved plans is no longer available;</li>
<li>one of its requirements is no longer met.</li>
</ul>
<p>If that happens, the plans are not forced through and you can make a new selection manually.</p>
<p>You can disable Auto-repeat at any time if you want to choose a different set of plans.</p>
<h3>Before Ending the Turn</h3>
<p>Before pressing End Turn, it is worth checking:</p>
<ul>
<li>how many Action Points remain;</li>
<li>which plans are currently selected;</li>
<li>their total Food and Resource costs;</li>
<li>whether Auto-repeat is enabled;</li>
<li>whether any plan requires something else before it can work.</li>
</ul>
<p>Once the turn ends, the selected plans are resolved as part of the normal turn economy.</p>
</div><div class="hub-textbox">
<h2>Stats & Checks</h2>
<p>Your six Stats represent the protagonist's main physical, mental, social, and leadership abilities.</p>
<p>They are used during events, dialogue, combat, diplomacy, tribe management, and other systems.</p>
<h3>Strength</h3>
<p>Strength represents raw physical power.</p>
<p>It is commonly used for:</p>
<ul>
<li>overpowering or restraining someone;</li>
<li>intimidation through physical presence;</li>
<li>forcing or breaking objects;</li>
<li>direct physical actions during dangerous situations;</li>
<li>some combat-related outcomes.</li>
</ul>
<p>High Strength is especially useful when you want to solve problems through direct force.</p>
<h3>Endurance</h3>
<p>Endurance represents toughness, stamina, and resistance to physical hardship.</p>
<p>It is commonly used for:</p>
<ul>
<li>surviving injury or exhaustion;</li>
<li>resisting pain, sickness, or harsh conditions;</li>
<li>prolonged physical effort;</li>
<li>difficult travel;</li>
<li>enduring situations that would overwhelm a normal person.</li>
</ul>
<p>Strength determines what you can physically do. Endurance is more concerned with how much punishment or strain you can withstand.</p>
<h3>Wisdom</h3>
<p>Wisdom represents observation, reasoning, judgement, and practical understanding.</p>
<p>It is commonly used for:</p>
<ul>
<li>noticing hidden details;</li>
<li>understanding unfamiliar situations;</li>
<li>planning;</li>
<li>recognising danger;</li>
<li>interpreting clues;</li>
<li>avoiding mistakes.</li>
</ul>
<p>Wisdom is often useful when you want more information before acting.</p>
<h3>Leadership</h3>
<p>Leadership represents your ability to command, organise, and coordinate other people.</p>
<p>It is commonly used for:</p>
<ul>
<li>giving effective orders;</li>
<li>organising groups;</li>
<li>directing warriors;</li>
<li>keeping people focused under pressure;</li>
<li>improving tribe-wide or military actions.</li>
</ul>
<p>Leadership is especially important when the result depends on what other people under your command are able to accomplish.</p>
<h3>Charisma</h3>
<p>Charisma represents personal influence and social skill.</p>
<p>It is commonly used for:</p>
<ul>
<li>persuasion;</li>
<li>negotiation;</li>
<li>diplomacy;</li>
<li>calming or inspiring people;</li>
<li>manipulating social situations;</li>
<li>influencing how others respond to you.</li>
</ul>
<p>Charisma is usually concerned with convincing people rather than commanding them.</p>
<h3>Stewardship</h3>
<p>Stewardship represents organisation, logistics, resource management, and practical administration.</p>
<p>It can help with:</p>
<ul>
<li>managing supplies;</li>
<li>reducing upkeep;</li>
<li>construction and Camp Works;</li>
<li>trade and economic decisions;</li>
<li>organising labour;</li>
<li>other situations where efficiency matters more than personal influence.</li>
</ul>
<p>Stewardship also reduces the Food upkeep of your main Population and can improve the efficiency of several tribe-management systems.</p>
<h3>Stat Checks</h3>
<p>Many choices use a Stat Check.</p>
<p>The usual format is:</p>
<p>Stat + d20 vs DC</p>
<p>A d20 is a random roll from 1 to 20.</p>
<p>The DC, or Difficulty Class, is the number you need to meet or exceed.</p>
<p>For example:</p>
<p>Wisdom 6 + d20 roll of 11 = 17</p>
<p>Against DC 15, that check succeeds.</p>
<p>Against DC 20, it fails.</p>
<p>Most checks in the game use this basic system.</p>
<h3>Difficulty</h3>
<p>Higher DC means a harder check.</p>
<p>Your stat is added directly to the roll, so every additional stat point improves your chance of success.</p>
<p>Some choices may use unusually low or high DCs depending on how difficult the action is supposed to be.</p>
<h3>Additional Modifiers</h3>
<p>Not every check is based only on your stat and the d20.</p>
<p>Some situations can include additional bonuses or penalties from things such as:</p>
<ul>
<li>relationships;</li>
<li>equipment;</li>
<li>Powers;</li>
<li>traits or flaws;</li>
<li>Military Strength;</li>
<li>Traditions;</li>
<li>the situation itself.</li>
</ul>
<p>When relevant, the result screen will usually show the important parts of the calculation.</p>
<h3>Checks Do Not Always Mean Success or Failure</h3>
<p>Failing a Stat Check does not always stop the story.</p>
<p>Depending on the event, failure may instead:</p>
<ul>
<li>produce a worse result;</li>
<li>cost resources;</li>
<li>cause injury or another penalty;</li>
<li>open a different path;</li>
<li>give incomplete information;</li>
<li>create a later problem.</li>
</ul>
<p>Likewise, succeeding may provide an advantage without completely solving the situation.</p>
<h3>Improving Stats</h3>
<p>Stats can be permanently improved by spending Belief.</p>
<p>Open: Character -> Powers</p>
<p>The stat panel there allows you to purchase increases.</p>
<p>For details on stat costs and divine progression, see Belief, Aspects & Powers.</p>
</div><div class="hub-textbox">
<h2>Traditions</h2>
<p>Traditions represent the customs and social habits developing within your tribe.</p>
<p>They are not upgrades that you buy and they are not a skill tree. Most Traditions are represented as a scale between two opposing directions.</p>
<p>You can view them from: World Actions -> Traditions</p>
<h3>How Traditions Change</h3>
<p>Traditions change through your actions.</p>
<p>Choices made during events, Season Plans, rituals, relationships, leadership decisions, migration, warfare, and other systems can gradually move the tribe toward one side of a Tradition.</p>
<p>You normally do not change a Tradition by pressing a button on the Traditions screen itself.</p>
<p>Instead, the screen shows where your tribe currently stands and what customs have developed from that position.</p>
<h3>Tradition Levels</h3>
<p>Each Tradition has several stages between its two extremes.</p>
<p>As the underlying value moves far enough in one direction, the tribe enters a new stage and its active effects may change.</p>
<p>A Tradition can also move back toward the centre or toward the opposite side if your later actions encourage different behaviour.</p>
<p>This means Traditions are not permanent choices. They reflect what your tribe has repeatedly been taught to consider normal.</p>
<h3>Camp Way</h3>
<p>Camp Way represents how strongly the tribe prefers a mobile way of life or a settled one.</p>
<p>Repeated migration pushes the tribe toward a more Mobile culture.</p>
<p>Remaining in one place and investing in the camp pushes it toward Rooted traditions.</p>
<p>Camp Way can affect systems connected to migration, settlement, and Camp Works.</p>
<h3>Voices of Authority</h3>
<p>Voices of Authority represents who the tribe expects to hold social and political authority.</p>
<p>Choices involving leadership, appointments, gender roles, and who is trusted with responsibility can move this Tradition.</p>
<p>It can affect how the tribe reacts to particular leaders, followers, or Camp Position assignments.</p>
<h3>Way of Survival</h3>
<p>Way of Survival represents how the tribe is accustomed to securing the resources and support it needs to survive.</p>
<p>At the Raid end, the tribe becomes increasingly comfortable taking what it needs from others through raids, intimidation, tribute, and other hostile actions. A tribe shaped this way becomes more effective at benefiting from aggression and conflict.</p>
<p>At the Hearth end, the tribe relies more on its own production and on cooperation with others. Trade, federation, peaceful agreements, and other forms of mutual support push the tribe in this direction.</p>
<p>It is not simply a measure of how violent the tribe is. It represents the tribe's broader economic and survival habits: taking from others versus building, producing, and cooperating.</p>
<h3>Bonds of Flesh</h3>
<p>Bonds of Flesh represents the tribe's customs surrounding sex, relationships, family, and exclusivity.</p>
<p>Your own relationships, sexual choices, rituals, and decisions involving other members of the tribe can gradually influence it.</p>
<p>Different stages can change how certain relationship or sexual situations are viewed by the tribe.</p>
<h3>Shape of Order</h3>
<p>Shape of Order represents the tribe's position between strong organisation and decentralised freedom.</p>
<p>Actions that reinforce rules, hierarchy, assigned responsibility, and formal organisation generally push toward Order.</p>
<p>Choices that favour personal independence, shared responsibility, or a lack of formal authority can push toward Anarchy.</p>
<p>Shape of Order can affect Stability, Camp Position management, upkeep, and events involving rules or authority.</p>
<h3>Seat of the Sacred</h3>
<p>Seat of the Sacred represents where the tribe believes sacred authority comes from.</p>
<p>At one end, religious authority becomes increasingly centred on you as Chieftain.</p>
<p>At the other, the tribe places more importance on Spirits and independent ritual authority.</p>
<p>Your behaviour during rituals, religious events, and decisions about who speaks for the sacred can move this Tradition.</p>
<p>It can affect religious events, rituals, and how the tribe interprets your divine role.</p>
<h3>Why Traditions Matter</h3>
<p>Traditions can:</p>
<ul>
<li>change passive bonuses or penalties;</li>
<li>unlock or alter events;</li>
<li>affect rituals and Season Plans;</li>
<li>change reactions to your decisions;</li>
<li>influence Camp Positions, relationships, warfare, religion, or settlement;</li>
<li>open content that only fits particular kinds of society.</li>
</ul>
<p>You do not need to deliberately optimise every Tradition.</p>
<p>They are primarily meant to make the tribe reflect how you have actually led it. If you want a specific kind of society, however, the Traditions screen is where you can check whether your actions are moving it in the direction you intended.</p>
</div><div class="hub-textbox">
<h2>Tribe & Economy</h2>
<p>Your tribe has several shared values that affect survival, growth, military strength, and long-term stability.</p>
<p>Most of them change through a mixture of passive end-of-turn effects, Season Plans, Camp Works, events, and your decisions.</p>
<h3>Population</h3>
<p>Population represents the size of your tribe.</p>
<p>More Population generally means:</p>
<ul>
<li>more passive production;</li>
<li>more potential military strength;</li>
<li>more people available to support the camp.</li>
</ul>
<p>It also means higher Food requirements.</p>
<p>Population can grow naturally over time, especially when conditions are stable. It can also increase or decrease through events, migration, warfare, starvation, and other systems.</p>
<h3>Food</h3>
<p>Food is used to feed the people in your camp.</p>
<p>Each turn, the tribe produces some Food passively. The amount depends on factors including:</p>
<ul>
<li>Population;</li>
<li>the current tile's Game;</li>
<li>the current Season;</li>
<li>Camp Positions, Camp Works, Federation effects, and other modifiers.</li>
</ul>
<p>The Hunt Game Season Plan can provide additional Food on top of passive production.</p>
<p>After production, Food upkeep is paid for the Population and for certain other people living in the camp.</p>
<p>Higher Stewardship can reduce the Food upkeep paid by your main Population.</p>
<p>If Food becomes too low, the tribe can suffer serious penalties and Population losses.</p>
<h3>Resources</h3>
<p>Resources represent common materials such as wood, stone, hides, and other basic supplies.</p>
<p>They are used for many systems, including:</p>
<ul>
<li>Season Plans;</li>
<li>Crafting;</li>
<li>Camp Works;</li>
<li>Camp Positions;</li>
<li>military preparation;</li>
<li>events and other costs.</li>
</ul>
<p>Your tribe produces some Resources passively each turn. The amount is affected by Population, the local Resources value of the tile, and other bonuses.</p>
<p>The Gather Resources Season Plan can temporarily increase resource gathering.</p>
<h3>Goods</h3>
<p>Goods are more valuable or specialised items used mainly for trade, diplomacy, rituals, and other higher-value costs.</p>
<p>Unlike ordinary Resources, Goods are usually harder to produce in large amounts.</p>
<p>Your stockpile of Goods also affects the tribe's Stability equilibrium.</p>
<p>Very roughly, having enough Goods to support the Population makes it easier for Stability to settle at a positive value, while having too few can pull the equilibrium downward.</p>
<h3>Stability</h3>
<p>Stability represents the tribe's social order, cohesion, and general sense that life in the camp is functioning properly.</p>
<p>Higher Stability generally supports Population growth and can improve or unlock certain outcomes.</p>
<p>Low Stability can lead to unrest, disobedience, negative events, and other problems.</p>
<p>Stability does not simply stay where you leave it.</p>
<p>Each turn it moves toward an equilibrium value. That equilibrium can be changed by Goods, Camp Positions, Traditions, equipment, Camp Works, terrain features, flaws, and other effects.</p>
<p>This means a temporary Stability gain may slowly fade if the conditions supporting it do not improve.</p>
<h3>Zeal</h3>
<p>Zeal represents the tribe's current religious enthusiasm and confidence in your divine role.</p>
<p>Higher Zeal increases passive Belief generation and can affect military morale, events, rituals, and other systems.</p>
<p>Like Stability, Zeal moves each turn toward an equilibrium value rather than remaining permanently at whatever number it last reached.</p>
<p>Its equilibrium can be changed by equipment, Camp Positions, Traditions, Camp Works, terrain features, effects, flaws, and other systems.</p>
<p>At a neutral equilibrium, temporary Zeal gains will gradually fall back toward normal unless something raises that equilibrium.</p>
<h3>Belief</h3>
<p>Belief is your supernatural currency.</p>
<p>Your tribe generates some Belief passively each turn. Population provides the base generation, while positive Zeal can increase the amount substantially.</p>
<p>Belief is used for stat upgrades, Powers, and other divine actions.</p>
<p>For details, see Belief, Aspects & Powers.</p>
<h3>Military Strength</h3>
<p>Military Strength is a broad estimate of how capable the tribe is in war.</p>
<p>Population is an important part of it, but equipment, Resources, Leadership, Zeal, training, Camp Works, and other bonuses can also contribute.</p>
<p>For details on combat and raids, see Military & Raids.</p>
<h3>End-of-Turn Economy</h3>
<p>When a turn ends, the game resolves several economic effects.</p>
<p>In broad terms:</p>
<ol>
<li>Selected Season Plans resolve.</li>
<li>Passive Food and Resources are produced.</li>
<li>Food and other upkeep are paid.</li>
<li>Population growth is processed.</li>
<li>Belief is generated.</li>
<li>Camp Works and other ongoing systems process their effects.</li>
<li>Events may add further changes.</li>
</ol>
<p>The Report shows a more detailed breakdown of what changed during that turn.</p>
</div><<silently>>
/* GAME OVER CHECK (population wiped out) */
<<if ($pops ?? 0) <= 0>>
<<goto "Game_Over">>
<</if>>
<<run setup.tutorial && setup.tutorial.reconcile ? setup.tutorial.reconcile() : null>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("stars") : null>>
<<if !$mainThemeStarted>>
<<set $mainThemeStarted = true>>
<<run setup.fadeToMainTheme(4)>>
<</if>>
<<set $uiUnlocks.map = true>>
<<set $uiUnlocks.quests = true>>
<<set $uiUnlocks.character = true>>
<<set $uiUnlocks.inventory = true>>
<<set $uiUnlocks.relationships = false>>
<<run setup.map.ensureCampSpawned()>>
<<run setup.map.randomizeTileYieldsOnce()>>
<<run setup.map.setPlayerSpawnTileBaseline()>>
<<run setup.flaws && setup.flaws.onHubRender ? setup.flaws.onHubRender() : null>>
<<if $questFlags and $questFlags.q_dominate_region_started>>
<<updateVictory_DominateRegion>>
<</if>><</silently>>''<div class="hub-wrap"><div class="hub-textbox hub-camp-text">
<<run setup.hubScenes.ensureCache()>>
<<print setup.hubScenes.render()>>
<<done>><<run setup.hubScenes.mount()>><</done>>
<<silently>>
<<link "Kill Tribe 1">>
<<debugKillTribe "npc_camp_1">>
<<goto "Hub_1">>
<</link>><br>
<<link "Kill Tribe 2">>
<<debugKillTribe "npc_camp_2">>
<<goto "Hub_1">>
<</link>><br>
<<link "Kill Tribe 3">>
<<debugKillTribe "npc_camp_3">>
<<goto "Hub_1">>
<</link>><br>
<<link "Kill Tribe 4">>
<<debugKillTribe "npc_camp_4">>
<<goto "Hub_1">>
<</link>><br>
<</silently>>
<<if $debug>><br><br><br><div class="hub-mishan-debug">
<<button "Debug: Initialize Mishan">>
<<run setup.mishan && setup.mishan.startCampaign ? setup.mishan.startCampaign({ route: "outcast_hostile" }) : null>>
<<goto "Hub_1">>
<</button>>
<<button "Debug: All Federated">>
<<if !$questFlags or !$questFlags.q_dominate_region_started>><<startVictory_DominateRegion>><</if>>
<<run setup.regionUnification.debugSetOutcome("allFederated")>>
<<updateVictory_DominateRegion>>
<</button>>
<<button "Debug: All Destroyed">>
<<if !$questFlags or !$questFlags.q_dominate_region_started>><<startVictory_DominateRegion>><</if>>
<<run setup.regionUnification.debugSetOutcome("allDestroyed")>>
<<updateVictory_DominateRegion>>
<</button>>
<<button "Debug: Mixed Region">>
<<if !$questFlags or !$questFlags.q_dominate_region_started>><<startVictory_DominateRegion>><</if>>
<<run setup.regionUnification.debugSetOutcome("mixed")>>
<<updateVictory_DominateRegion>>
<</button>>
</div><</if>>
</div>''<div class="hub-actions-wrap"><div class="hub-actions hub-grid">
<<button [[Season Plan|SeasonPlan]]>><</button>>
<<if $metTribes && $metTribes.length > 0>>
<<button [[Other Tribes|OtherTribes]]>><</button>>
<<else>>
<button class="hub-disabled" disabled>Other Tribes</button>
<</if>>
<<npcAnyTalkQuestOfferAvailable>>
<<if _anyNpcTalkQuestOfferAvailable>>
<a class="link-internal hub-interact-quest-link" data-passage="Interact" tabindex="0">Interact<span class="hub-interact-quest-badge" title="Quest available">!</span></a>
<<else>>
<<button [[Interact|Interact]]>><</button>>
<</if>>
<button type="button" class="link-internal" data-hub-context-action>Crafting</button>
<<expeditionButton>>
<<button [[Ritual|Ritual]]>><</button>>
</div>
</div><<silently>>
<<if setup.campNpcs and setup.campNpcs.ensureState>><<run setup.campNpcs.ensureState()>><</if>>
<<if setup.people and setup.people.syncCampNpcsToPeople>><<run setup.people.syncCampNpcsToPeople()>><</if>>
<<if setup.campPositions and setup.campPositions.ensureState>><<run setup.campPositions.ensureState()>><</if>>
<<if setup.prisoners and setup.prisoners.ensureState>><<run setup.prisoners.ensureState()>><</if>>
<<if !$interactPeopleTab>><<set $interactPeopleTab = "important">><</if>>
<<if $interactPeopleTab is not "important" and $interactPeopleTab is not "followers" and $interactPeopleTab is not "prisoners">><<set $interactPeopleTab = "important">><</if>>
<<set _campPeople = ($campNpcs and $campNpcs.length) ? $campNpcs.filter(n => n and n.id) : []>>
<<set _importantPeople = _campPeople.filter(n => !(setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(n)))>>
<<set _generatedPeople = _campPeople.filter(n => setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(n))>>
<<set _prisonerPeople = (setup.prisoners and setup.prisoners.list) ? setup.prisoners.list() : []>>
<<set _campPeopleCount = _campPeople.length>>
<<set _importantPeopleCount = _importantPeople.length>>
<<set _generatedPeopleCount = _generatedPeople.length>>
<<set _prisonerPeopleCount = _prisonerPeople.length>>
<<set _assignedPositionCount = (setup.campPositions and setup.campPositions.countAssigned) ? setup.campPositions.countAssigned() : 0>>
<<set _stewardshipValue = (setup.player and setup.player.getEffectiveStewardship) ? setup.player.getEffectiveStewardship() : Math.max(0, Number($stewardship ?? 0))>>
<<set _managedUpkeepReduction = (setup.player and setup.player.stewardshipManagedUpkeepReduction) ? setup.player.stewardshipManagedUpkeepReduction(_stewardshipValue) : 0>>
<<set _managedUpkeepPercent = Math.round(_managedUpkeepReduction * 1000) / 10>>
<<set _positionResourceUpkeep = (setup.campPositions and setup.campPositions.getUpkeepTotal) ? setup.campPositions.getUpkeepTotal("resources", { preview: true }) : 0>>
<<set _positionResourceUpkeepBase = (setup.campPositions and setup.campPositions.getUpkeepTotal) ? setup.campPositions.getUpkeepTotal("resources", { preview: true, base: true }) : _positionResourceUpkeep>>
<<set _followerFoodUpkeep = (setup.campNpcs and setup.campNpcs.getGeneratedFoodUpkeepTotal) ? setup.campNpcs.getGeneratedFoodUpkeepTotal() : (_generatedPeopleCount * 5)>>
<<set _followerFoodUpkeepBase = (setup.campNpcs and setup.campNpcs.getGeneratedFoodUpkeepBaseTotal) ? setup.campNpcs.getGeneratedFoodUpkeepBaseTotal() : (_generatedPeopleCount * 5)>>
<<set _prisonerFoodUpkeep = (setup.prisoners and setup.prisoners.getFoodUpkeepTotal) ? setup.prisoners.getFoodUpkeepTotal() : (_prisonerPeopleCount * 5)>>
<<set _prisonerFoodUpkeepBase = (setup.prisoners and setup.prisoners.getFoodUpkeepBaseTotal) ? setup.prisoners.getFoodUpkeepBaseTotal() : (_prisonerPeopleCount * 5)>>
<<set _peopleFoodUpkeep = Number(_followerFoodUpkeep) + Number(_prisonerFoodUpkeep)>>
<<set _peopleFoodUpkeepBase = Number(_followerFoodUpkeepBase) + Number(_prisonerFoodUpkeepBase)>>
<<set _foodUpkeepSaved = Math.max(0, _peopleFoodUpkeepBase - _peopleFoodUpkeep)>>
<<set _resourceUpkeepSaved = Math.max(0, _positionResourceUpkeepBase - _positionResourceUpkeep)>>
<<set _shapeOrderLevel = (setup.traditions and setup.traditions.getLevel) ? setup.traditions.getLevel("shapeOfOrder") : null>>
<<set _foodUpkeepTip = "Base: " + _peopleFoodUpkeepBase + " Food/turn\nStewardship " + _stewardshipValue + " (" + _managedUpkeepPercent + "%): saves " + _foodUpkeepSaved + "\nFinal: " + _peopleFoodUpkeep + " Food/turn">>
<<set _resourceUpkeepTip = "Base: " + _positionResourceUpkeepBase + " Resources/turn\nStewardship " + _stewardshipValue + " (" + _managedUpkeepPercent + "%): saves " + _resourceUpkeepSaved + ((_shapeOrderLevel && (_shapeOrderLevel.id === "ordered" || _shapeOrderLevel.id === "law_bound")) ? ("\nShape of Order: " + _shapeOrderLevel.label) : "") + "\nFinal: " + _positionResourceUpkeep + " Resources/turn">>
<<set _securityBreakdown = (setup.prisoners and setup.prisoners.getSecurityBonuses) ? setup.prisoners.getSecurityBonuses() : { warden: 0, guards: 0, structures: 0, total: 0 }>>
<<set _securityLevelTotal = Number(_securityBreakdown.total ?? 0)>>
<<set _securityLevelLabel = (setup.prisoners and setup.prisoners.getSecurityLabel) ? setup.prisoners.getSecurityLabel(_securityLevelTotal) : String(_securityLevelTotal)>>
<<set _securityTip = "Camp security deters escape attempts and lowers escape success.\nGuards: +" + _securityLevelTotal>>
<<set _recruitCost = (setup.campNpcs and setup.campNpcs.getRecruitCost) ? setup.campNpcs.getRecruitCost() : { pops: 1, food: 50 }>>
<<set _canRecruitFollower = (setup.campNpcs and setup.campNpcs.canRecruitGeneratedNpc) ? setup.campNpcs.canRecruitGeneratedNpc() : (Number($pops ?? 0) > 2 and Number($food ?? 0) >= 50)>>
<<set _recruitTip = "Recruitment cost: -" + _recruitCost.pops + " Population, -" + _recruitCost.food + " Food.">>
<<set _recruitBlockReason = Number($pops ?? 0) <= 2 ? " Population must stay above 2." : (Number($food ?? 0) < Number(_recruitCost.food ?? 50) ? " You do not have enough food." : " You cannot recruit right now.")>>
<<set _interactModeClass = "interact-modern">>
<<set _pendingTalkCount = 0>>
<<set _strongestPerson = null>>
<<set _strongestScore = -999999>>
<<set _bestLeaderPerson = null>>
<<set _bestLeaderScore = -999999>>
<<if _campPeopleCount>>
<<for _ci = 0; _ci < _campPeople.length; _ci++>>
<<set _cp = _campPeople[_ci]>>
<<set _cpId = String(_cp.id ?? "")>>
<<npcTalkQuestOfferAvailable _cpId>>
<<if _npcTalkQuestOfferAvailable>><<set _pendingTalkCount += 1>><</if>>
<<set _cpStrength = (setup.campNpcs and setup.campNpcs.getRaidStat) ? setup.campNpcs.getRaidStat(_cp, "strength") : Number(_cp.strength ?? _cp.raidLeader?.statsBase?.strength ?? 0)>>
<<set _cpLeadership = (setup.campNpcs and setup.campNpcs.getRaidStat) ? setup.campNpcs.getRaidStat(_cp, "leadership") : Number(_cp.leadership ?? _cp.raidLeader?.statsBase?.leadership ?? 0)>>
<<set _cpCanLead = (setup.campNpcs and setup.campNpcs.canBeGeneral) ? setup.campNpcs.canBeGeneral(_cp) : !!_cp.raidLeader?.canBeGeneral>>
<<if _cpStrength > _strongestScore>><<set _strongestScore = _cpStrength>><<set _strongestPerson = _cp>><</if>>
<<if _cpCanLead and _cpLeadership > _bestLeaderScore>><<set _bestLeaderScore = _cpLeadership>><<set _bestLeaderPerson = _cp>><</if>>
<</for>>
<</if>>
<</silently>>
<div @class="_interactModeClass">
<div class="interact-modern-head">
<div>
<div class="interact-modern-kicker">Camp People</div>
<div class="interact-modern-title">Interact</div>
<div class="interact-modern-sub">Speak with important people, inspect camp followers, handle prisoners, and answer matters waiting for your attention.</div>
</div>
<div class="interact-modern-actions">
<<button "Return">><<goto "Hub_1">><</button>>
</div>
</div>
<div class="interact-modern-panel">
<div class="interact-switch-row">
<div class="interact-switch-tabs">
<<if $interactPeopleTab is "important">>
<span class="interact-switch-tab is-active">Important</span>
<<else>>
<<button "Important">><<set $interactPeopleTab = "important">><<goto "Interact">><</button>>
<</if>>
<<if $interactPeopleTab is "followers">>
<span class="interact-switch-tab is-active">Camp Followers</span>
<<else>>
<<button "Camp Followers">><<set $interactPeopleTab = "followers">><<goto "Interact">><</button>>
<</if>>
<<if $interactPeopleTab is "prisoners">>
<span class="interact-switch-tab is-active">Prisoners</span>
<<else>>
<<button "Prisoners">><<set $interactPeopleTab = "prisoners">><<goto "Interact">><</button>>
<</if>>
</div>
<div class="interact-upkeep-strip">
<span class="interact-upkeep-tooltip" @data-tip="_foodUpkeepTip" tabindex="0">Food Upkeep <strong>-<<print _peopleFoodUpkeep>>/turn</strong></span>
<span class="interact-upkeep-tooltip" @data-tip="_resourceUpkeepTip" tabindex="0">Resource Upkeep <strong>-<<print _positionResourceUpkeep>>/turn</strong></span>
<span class="interact-upkeep-tooltip" @data-tip="_securityTip" tabindex="0">Security <strong>+<<print _securityLevelTotal>></strong></span>
</div>
<div class="interact-actions interact-recruit-slot">
<<if $interactPeopleTab is "followers">>
<<if _canRecruitFollower>>
<span class="interact-recruit-wrap interact-recruit-tooltip" @data-tip="_recruitTip"><<button "Recruit">>
<<set $interactPeopleTab = "followers">>
<<run setup.campNpcs.openRecruitCandidateDialog()>>
<</button>></span>
<<else>>
<span class="macro-button disabled interact-recruit-disabled interact-recruit-tooltip" @data-tip="_recruitTip + _recruitBlockReason" aria-disabled="true" tabindex="0">Recruit</span>
<</if>>
<</if>>
</div>
</div>
<div class="interact-modern-list interact-list">
<<if $interactPeopleTab is "prisoners">>
<<print setup.prisoners.renderList()>>
<<elseif $interactPeopleTab is "followers">>
<<if _generatedPeopleCount > 0>>
<<campNpcList "generated">>
<<else>>
<div class="interact-modern-empty">
<strong>No camp followers yet</strong>
<span>Use Recruit to bring a new camp follower into your people.</span>
</div>
<</if>>
<<else>>
<<if _importantPeopleCount > 0>>
<<campNpcList "important">>
<<else>>
<div class="interact-modern-empty">
<strong>No important people here</strong>
<span>Authored camp characters will appear here.</span>
</div>
<</if>>
<</if>>
</div>
</div>
</div>''<div class="intro-grounded intro-prologue-shell no-click-sfx">
Speech comes slowly.
Gestures first. Shared work second. Words later.
You learn the shape of their camp: where the fires are built, where food is stored, where children are told not to wander, where the old sit when their bones ache. You learn who laughs easily, who watches too much, who gives orders, and who only speaks when they feel they need to say something.
They learn the sound of your name.
You are not kin. Not yet. But when the fires are lit at night, no one sends you away.
In the first years, you earn your place by...
<div class="intro-divider"></div>
<div class="hub-buttons">
<<button "Hunting the great beasts others feared">>
<<set $introEarlyChoice = "strength">>
<<set $strength += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Settling quarrels with stories, jokes, and hard words">>
<<set $introEarlyChoice = "charisma">>
<<set $charisma += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Reading signs in the land others missed">>
<<set $introEarlyChoice = "wisdom">>
<<set $wisdom += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Enduring cold, hunger, and pain without complaint">>
<<set $introEarlyChoice = "endurance">>
<<set $endurance += 2>>
<<goto "TheEarlyYears">>
<</button>>
</div>
</div>''''<div class="intro-grounded intro-prologue-shell no-click-sfx">
As the tension settles into something quieter, a man approaches.
He is middle-aged, broad-shouldered, and marked by the sort of calm that makes others look to him before deciding what to do. His eyes move over you carefully, taking in your face, your hands, your unsteady stance.
Then he speaks.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Chieftain</span>
<span class="dialogue-line">...Can you understand me?</span>
</div>
To your surprise, you can.
The words themselves are only sounds. Strange shapes of breath and tongue. But the meaning behind them reaches you clearly enough.
You try to answer, but your mouth does not know how. Your tongue feels heavy and useless. So you give a rough, approving grunt.
Somehow, the meaning of that comes across as well.
The man gives a small nod.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Chieftain</span>
<span class="dialogue-line">Then would you like to join us? We will feed you. Heal you. Dress you. You will learn our speech, and our ways.</span>
</div>
You stare at him without answering.
He seems to find the confusion in your eyes. A faint smile touches his face. He places one large hand on the boy's head and ruffles his hair, to the child's silent displeasure.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Chieftain</span>
<span class="dialogue-line">Do not worry. It is not free. When you learn to speak, I will have you speak until your tongue aches. When you learn to hunt, you will hunt until no game remains. You will give back to the tribe in time.</span>
</div>
His smile softens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Chieftain</span>
<span class="dialogue-line">Until then, rest.</span>
</div>
The offer sounds tempting, for whatever that is worth. Though this is the first waking moment you remember, your body feels as if it has gone many days without sleep.
Your legs fail.
As you fall, the world darkening around you, the last thing you hear is the man speaking to the child.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Chieftain</span>
<span class="dialogue-line">Kael, take care of our new family member, will you? They seem fond of lying in the wilderness.</span>
</div>
<div class="hub-buttons">
<<button "Darkness comes again.">>
<<goto "Intro_FirstYears">>
<</button>>
</div>
</div>''<<nobr>>
<<script>>
try { if (setup.inventory && typeof setup.inventory.ensureState === "function") setup.inventory.ensureState(); } catch (e) {}
try { if (setup.artifacts && typeof setup.artifacts.ensureState === "function") setup.artifacts.ensureState(); } catch (e) {}
<</script>>
<div class="invui-root">
<<script>>
setTimeout(function () {
try { setup.inventory.applyRarityUi(document); } catch (e) {}
}, 0);
<</script>>
<<if !$invTab>><<set $invTab = "items">><</if>>
<div class="invui-header">
<<invTabs>>
<div class="char-return invui-return">
<<return>>
</div>
</div>
<<if $invTab is "items">>
<div class="inventory-layout inv-items-layout">
<div class="inventory-panel inv-left">
<h2>INVENTORY</h2>
<div class="inv-hint">Click an item to view details. Equip gear, use consumables, and track stacks.</div>
<<invCapacitySummary>>
<<invCollectionControls>>
<div class="inv-items-main">
<<invItemGrid>>
<div class="inv-footer inv-details-footer">
<<invDetailsFooter>>
</div>
</div>
<<if $debug>>
<div class="inv-debug-row">
<div class="inv-debug">
<<invDebugGrant>>
</div>
</div>
<</if>>
</div>
<div class="inventory-panel inv-right">
<h2>EQUIPMENT</h2>
<div class="inv-hint">Each slot holds one item. Select gear to highlight compatible slots. Most equipped items lose durability each turn.</div>
<<invEquipPanel>>
</div>
</div>
<<else>>
<!-- ARTIFACTS VIEW -->
<div class="inventory-layout inv-artifacts-layout">
<div class="inventory-panel inv-left">
<h2>RELICS</h2>
<div class="inv-hint">Click a relic to view details. Activate effects by spending Belief.</div>
<div class="artifact-gridbox">
<<artifactGrid>>
</div>
<<if $debug>>
<div class="inv-debug artifact-debug-row">
<<button "Grant test relic (Shattered Idol)">>
<<run setup.artifacts.grant("relic_test")>>
<<goto "Inventory">>
<</button>>
</div>
<</if>>
</div>
<div class="inventory-panel inv-right artifact-status-panel">
<h2>STATUS</h2>
<div class="inv-status">
<<set _ownedKeys = ($relics and Array.isArray($relics.owned)) ? $relics.owned : []>>
<<set _beliefUpkeep = 0>>
<<set _artifactActiveKeys = []>>
<<if $relics and $relics.active>>
<<set _artifactAllActive = Object.keys($relics.active)>>
<<for _a = 0; _a < _artifactAllActive.length; _a++>>
<<set _artifactId = String(_artifactAllActive[_a])>>
<<if setup.artifacts and setup.artifacts.isActive(_artifactId)>>
<<run _artifactActiveKeys.push(_artifactId)>>
<<set _beliefUpkeep += (setup.artifacts.getUpkeepCost ? Number(setup.artifacts.getUpkeepCost(_artifactId) || 0) : 0)>>
<</if>>
<</for>>
<</if>>
<div class="artifact-status-modern">
<div class="artifact-metric-row"><b>Owned:</b> <span><<print _ownedKeys.length>></span></div>
<div class="artifact-metric-row"><b>Active relics:</b> <span><<print _artifactActiveKeys.length>></span></div>
<div class="artifact-status-block">
<div class="artifact-status-head"><b>Current active effects</b></div>
<<if !_artifactActiveKeys.length>>
<div class="artifact-status-empty">No active effects.</div>
<<else>>
<ul class="artifact-effects-list">
<<for _a = 0; _a < _artifactActiveKeys.length; _a++>>
<<set _artifactId = String(_artifactActiveKeys[_a])>>
<<set _artifactDef = setup.artifacts ? setup.artifacts.byId(_artifactId) : null>>
<<set _artifactRem = setup.artifacts ? setup.artifacts.activeRemaining(_artifactId) : 0>>
<<set _artifactEffects = []>>
<<if _artifactDef and _artifactDef.activeEffects and _artifactDef.activeEffects.length>><<set _artifactEffects = _artifactEffects.concat(_artifactDef.activeEffects)>><</if>>
<<if _artifactDef and _artifactDef.active and _artifactDef.active.effects and _artifactDef.active.effects.length>><<set _artifactEffects = _artifactEffects.concat(_artifactDef.active.effects)>><</if>>
<<if _artifactDef and _artifactDef.active and _artifactDef.active.desc>><<run _artifactEffects.push(_artifactDef.active.desc)>><</if>>
<<if _artifactDef and _artifactDef.activeText>><<run _artifactEffects.push(_artifactDef.activeText)>><</if>>
<li>
<div class="artifact-effects-name">
<span><<print _artifactDef ? _artifactDef.name : _artifactId>></span>
<span class="artifact-effects-rem"><<print Math.max(1, _artifactRem)>>t</span>
</div>
<<if !_artifactEffects.length>>
<div class="artifact-effects-text artifact-effects-empty">Active.</div>
<<else>>
<<for _j = 0; _j < _artifactEffects.length; _j++>>
<div class="artifact-effects-text"><<= _artifactEffects[_j]>></div>
<</for>>
<</if>>
</li>
<</for>>
</ul>
<</if>>
</div>
<div class="artifact-upkeep-row">
<b>Current belief upkeep:</b>
<span class="artifact-upkeep-value"><<if _beliefUpkeep > 0>><<print _beliefUpkeep>>/turn<<else>>-<</if>></span>
<span><<if _beliefUpkeep > 0>><<print _beliefUpkeep>>/turn<<else>>—<</if>></span>
</div>
</div>
<div class="artifact-status-legacy">
<<set _activeKeys = []>>
<<if $relics and $relics.active>>
<<set _activeKeys = Object.keys($relics.active)>>
<</if>>
<<if !_activeKeys.length>>
<div class="inv-status-empty">—</div>
<<else>>
<ul class="inv-active-list">
<<for _i = 0; _i < _activeKeys.length; _i++>>
<<set _id = String(_activeKeys[_i])>>
<<if setup.artifacts && setup.artifacts.isActive(_id)>>
<<set _def = setup.artifacts.byId(_id)>>
<<set _rem = setup.artifacts.activeRemaining(_id)>>
<li>
<span class="inv-active-name"><<print _def ? _def.name : _id>></span>
<span class="inv-active-rem"><<print Math.max(1, _rem)>>t</span>
</li>
<</if>>
<</for>>
</ul>
<</if>>
</div>
</div>
</div>
</div>
<</if>>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
/* ===========================
START QUEST: The Wildling Marker on CURRENT tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_wildling_01">>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: "The Wildling",
desc: "A feral woman set a trap for you. She slipped away into the forest before you could seize her.",
objective: "Use Expedition on your current tile.",
status: "active",
targetX: Number($campX ?? 0),
targetY: Number($campY ?? 0),
markerRevealed: true,
expeditionPassage: "Quest_Wildling"
})>>
/* Optional: auto-track so it stands out */
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Refresh map if you have a renderer */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<p>You move the instant she shifts.</p>
<p>For a heartbeat she only stares. Whatever she expected from you, it was not speed like this.</p>
<p>Then the trap she built earns her the one thing she needs: time.</p>
<p>A loose cord catches your foot. Another loop tightens. It could never hold you, but it steals your balance for a fraction of a second.</p>
<p>That fraction is enough.</p>
<p>Your hand closes on empty air where she stood. She is already gone, low and quick between the trunks, moving through the forest with the confidence of someone who knows every root and gap before she reaches it.</p>
<p>You could chase her, but catching her would not be simple. You have speed. She has terrain, familiarity, and a head start bought with her own trap.</p>
<p>You stop and listen to the direction of her retreat instead.</p>
<p>Agile, certainly. You doubt many of your hunters could match her in that respect.</p>
<p>Whatever you intended to do with her will have to wait.</p>
<p>Assuming you find her again.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Wildling</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* ===========================
START QUEST: The Wildling Marker on CURRENT tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_wildling_01">>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: "The Wildling",
desc: "A feral woman set a trap for you—and understood your words. She fled into the forest. It didn’t feel like an ending.",
objective: "Use Expedition on your current tile.",
status: "active",
targetX: Number($campX ?? 0),
targetY: Number($campY ?? 0),
markerRevealed: true,
expeditionPassage: "Quest_Wildling"
})>>
/* Optional: auto-track so it stands out */
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Refresh map if you have a renderer */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<p>You raise your hands slowly, palms open and empty, and make no move toward her.</p>
<p>Then you speak.</p>
<p>The sounds should be meaningless to her. She has given no sign that she knows your language, and nothing about her suggests much contact with anyone who does.</p>
<p>Yet the moment the words leave your mouth, understanding reaches her.</p>
<p>Not gradually. Not through guesswork.</p>
<p>Her eyes widen slightly. She understands you as cleanly as you understood the wounded stranger before her, and the surprise on her face suggests this is no more normal to her than it is to you.</p>
<<if _hasSway>>
<p>You let the familiar pressure settle beneath your voice. It is not a command so much as an easy certainty, a warmth that makes the meaning of your words feel safer to accept.</p>
<p>For a few moments it works. Some of the tension leaves her shoulders. Her stare loses its hard focus as listening becomes easier than resisting.</p>
<p>Then she catches herself.</p>
<p>Her head jerks slightly, as though waking from shallow sleep. The softness disappears at once. If anything, the realization makes her more guarded than before.</p>
<p>She bolts before you can speak again and vanishes between the trees.</p>
<<else>>
<<if _talkCheck >= 8>>
<p>You keep your voice low and steady. You do not step closer or crowd her. You simply talk, giving her time to hear the calm in your tone as well as the meaning in your words.</p>
<p>For a moment she seems uncertain.</p>
<p>Her eyes flick toward the forest, then back to you. Something in her weighs the possibility you are offering. She swallows, jaw tight, and shakes her head once as if rejecting the thought before it can settle.</p>
<p>One step backward. Then another.</p>
<p>She never fully turns her back on you. She simply retreats until the trees take her from sight.</p>
<<else>>
<p>Your hands remain open and your voice stays level, but whatever you choose to say does not reach her the way you intended.</p>
<p>Perhaps the tone is wrong. Perhaps hesitation sounds like deception. Whatever the reason, her eyes never lose their suspicion.</p>
<p>If anything, your attempt gives her time to make up her mind.</p>
<p>She retreats suddenly, guard still raised, and disappears into the forest before you can try again.</p>
<</if>>
<</if>>
<p>You could follow, but catching her on ground she knows this well would be difficult even for you. One burst of speed might close the distance. After that, every path, root, and blind angle would favor her.</p>
<p>For now, the encounter is over.</p>
<p>It does not feel finished.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Wildling</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<endMajorEvent>>
<</button>>
</div><div class="fg-title-menu no-click-sfx">
<div class="fg-hero" data-menu-theme="general">
<<silently>><<script>>
try {
/* Stop SugarCube tracks created by the audio macros. */
if (typeof SimpleAudio !== "undefined") {
SimpleAudio.stop();
SimpleAudio.mute(false);
}
/* Stop raw HTML5 audio elements as a failsafe. */
document.querySelectorAll("audio").forEach(a => {
try { a.pause(); a.currentTime = 0; } catch (e) {}
});
} catch (e) {}
<</script>><</silently>>
<<run setup.menuTheme && setTimeout(setup.menuTheme.apply, 0)>>
<<if $debug is true>>
<div class="fg-menu-theme-debug" role="group" aria-label="Debug menu theme preview">
<span class="fg-menu-theme-debug-label">Menu theme</span>
<button type="button" data-menu-theme-step="-1" aria-label="Preview previous menu theme">
<svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><path d="M12.5 4.5 7 10l5.5 5.5"/></svg>
</button>
<output class="fg-menu-theme-debug-name" data-menu-theme-preview-name>General</output>
<button type="button" data-menu-theme-step="1" aria-label="Preview next menu theme">
<svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><path d="m7.5 4.5 5.5 5.5-5.5 5.5"/></svg>
</button>
<button class="fg-menu-theme-real" type="button" data-menu-theme-clear-preview aria-label="Use persistent menu theme">Real</button>
</div>
<<run setTimeout(setup.menuTheme.bindDebugControls, 0)>>
<</if>>
<div class="fg-menu-stage">
<header class="fg-masthead">
<div class="fg-kicker">A Chronicle Written When Time Began To Move Again</div>
<div class="fg-title">The First Gods</div>
<div class="fg-title-rule" aria-hidden="true"></div>
<div class="fg-subtitle">A myth of power, survival, and desire.</div>
</header>
<nav class="fg-menu-nav" aria-label="Main menu">
<div class="fg-menu-nav-frame">
<div class="fg-actions">
<span class="fg-action-primary"><<button [[Begin your journey|Age_Check]]>><</button>></span>
<span class="fg-action-secondary"><<button "Load">>
<<run setup.systemSaves.open()>>
<</button>></span>
<span class="fg-action-secondary"><<button "Settings">>
<<run setup.systemSettings.open()>>
<</button>></span>
</div>
</div>
</nav>
<div class="fg-menu-meta">A chronicle in development</div>
</div>
<a class="fg-menu-support"
href="https://www.patreon.com/cw/KaspeliProductions"
target="_blank"
rel="noopener noreferrer"
aria-label="Support The First Gods on Patreon">
<img class="fg-patreon-logo" src="images/patreon_logo.png" alt="">
<span class="fg-patreon-text">Support on Patreon</span>
</a>
</div>
</div><<nobr>>
<div class="character-layout">
<div class="character-panel">
<div class="map-screen-shell map-screen-shell--survey">
<div class="map-screen-head">
<div class="map-screen-kicker">Travel Board</div>
<h2 class="map-screen-title">Survey the Surrounding Lands</h2>
<div class="map-screen-intro">Study the country beyond the campfire. Click any tile to inspect what can be known from afar.</div>
</div>
<div class="map-screen-meta">
<div class="map-legend-item">
<span class="map-legend-swatch is-camp"></span>
<span><strong>Camp</strong> marks where your people dwell now.</span>
</div>
<div class="map-legend-item">
<span class="map-legend-swatch is-quest"></span>
<span><strong>Tracked signs</strong> point to quests and unusual omens.</span>
</div>
<div class="map-legend-item">
<span class="map-legend-swatch is-tribe"></span>
<span><strong>Known camps</strong> and landmarks remain readable at a glance.</span>
</div>
</div>
<<setOutControls>>
<<if $debug is true>>
<<set $debugCampMoveMode = $debugCampMoveMode ?? false>>
<div class="inv-debug-row">
<div class="inv-debug">
<strong>Debug camp move:</strong>
<<if $debugCampMoveMode>>
<<button "Infinite relocate ON">>
<<set $debugCampMoveMode = false>>
<<run Engine.play("Map")>>
<</button>>
<<else>>
<<button "Infinite relocate OFF">>
<<set $debugCampMoveMode = true>>
<<run Engine.play("Map")>>
<</button>>
<</if>>
<div class="muted" style="margin-top:6px;">While active, click any map tile and choose <b>Move camp here</b>. Forbidden and occupied camp tiles remain blocked.</div>
</div>
</div>
<</if>>
<div class="map-board-shell">
<<mapGrid>>
</div>
<!-- still available for debugging; styled subtly in CSS -->
<<silently>>
<<debugTribeCoords>>
<</silently>>
<div class="char-return map-screen-return">
<<return>>
</div>
</div>
</div>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<nobr>>
<div class="character-layout">
<div class="character-panel">
<div class="map-screen-shell map-screen-shell--migration">
<div class="map-screen-head">
<div class="map-screen-kicker">Migration Rite</div>
<h2 class="map-screen-title">Choose the Next Homeland</h2>
<div class="map-screen-intro">The tribe waits on your reading of the land. Inspect a reachable tile, then mark the place where the camp will be carried.</div>
</div>
<div class="migration-guidance">
<div class="migration-guidance-item">
<span class="map-legend-swatch is-reachable"></span>
<span><strong>Gold-ringed tiles</strong> are reachable this move.</span>
</div>
<div class="migration-guidance-item">
<span class="map-legend-swatch is-chosen"></span>
<span><strong>Ember-marked ground</strong> is your chosen destination.</span>
</div>
</div>
<div class="map-board-shell map-board-shell--migration">
<<relocateMap>>
</div>
<div class="migration-note">
<strong>How to commit:</strong> inspect a reachable tile, choose <b>Migrate here</b> in the land card, then use <b>Continue</b> once the destination is marked.
<<migrationModeControls>>
</div>
</div>
</div>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
<<set $stability = Math.max(0, Number($stability ?? 0) - 3)>>
<</silently>>
''<div class="intro-grounded intro-prologue-shell intro-dying no-click-sfx">
The land begins to fail.
Herds grow smaller. Some vanish entirely. Riverbeds show pale stone where water used to run. Berries dry on the branch. Game trails empty. Even the birds seem to move elsewhere.
A memory that does not feel like yours stirs at the edge of thought: lands changing, seasons breaking, people waiting too long to leave.
It brings no comfort.
Your people grow hungry. Elders watch the children in silence. Hunters return with less and speak in shorter sentences.
<div class="intro-notification bad">Stability begins to fray. (-3 Stability)</div>
You see what others do not want to see: the change in the wind, the wrong quiet in the trees, the tracks that no longer cross old ground.
This place will not recover in time.
If your people are to live, you must lead them elsewhere.
Under the cover of night, you climb to high ground and look out over the darkened land.
<div class="intro-divider"></div>
<div class="hub-buttons">
<<button "West - Into forests so dense they swallow the light">>
<<goto "Migration_West">>
<</button>>
</div>
</div>''<<silently>>
<<set _popLoss = random(1,3)>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _popLoss)>>
<</silently>>
''<div class="intro-grounded intro-prologue-shell intro-dying no-click-sfx">
You choose west.
The oldest hunters speak of deep forests there, old enough to hide rivers beneath their roots and thick enough to shelter game even in lean years. It is not a safe path, but safety is no longer something this land can offer.
The tribe follows.
The first days are hard.
Then the forest becomes worse.
Roots catch ankles. Thorned brush tears skin and hide. Clear paths vanish beneath fallen trees. Rain turns camps to mud. Smoke clings low and bitter when dry wood cannot be found.
The old struggle. The young stumble. Illness spreads in damp nights where rest is never deep enough. You carry those you can. You stand watch when others sleep. You keep the line moving.
Still, not everyone reaches the next fire.
<div class="intro-notification bad">Your population dwindles.</div>
There is little ceremony for the dead. A few words. A few stones. Then the march continues.
Weeks become months.
The forest thickens until sunlight feels distant. Birdsong fades into stranger calls that echo too long between the trunks. Sometimes you sense eyes beyond the firelight. Sometimes predators test the camp and learn to fear you.
The tribe learns to move quietly. To sleep close. To trust the hand ahead of them in the dark.
Winter comes early beneath the canopy. Food runs thin. Tempers fray. Doubt creeps in with the cold, but you press on.
Then, after nearly a year of hardship, the forest changes.
<div class="hub-buttons">
<<button "Continue">>
<<goto "Migration_West_Feeling">>
<</button>>
</div>
</div>''<<silently>>
<<set $stability = Number($stability ?? 0) + 2>>
<</silently>>
''<div class="intro-grounded intro-prologue-shell no-click-sfx">
The ground softens beneath your feet.
The air grows warmer, richer, heavy with green life. Clear rivers cut through the trees, wide enough to glimmer even beneath the canopy. Fish move in the shallows. Game trails cross and cross again, deep from use. Fruit hangs near the water, dark and heavy on the branches.
The tribe feels it before anyone speaks.
Shoulders loosen. Voices rise. Children laugh for the first time in many moons. Hunger, constant for so long, finally loosens its grip.
This land can feed your people.
You order the camp raised along the riverbank. Not as a final home, but as a place to breathe. A place to bind wounds. A place to think beyond tomorrow's meal.
Fires are lit. Shelters rise. The wounded sleep.
Relief spreads through the camp, but you remain watchful.
Land this rich is rarely empty for long.
The river is too generous. The forest too full. Somewhere beyond the trees, others may already know of this place. Others may already be watching.
Still, for now, you have found sanctuary.
A place between journeys. A place where choices will be made. A place from which your people can begin again.
<div class="intro-notification good">The tribe steadies. (+2 Stability)</div>
This will become your camp.
<div class="hub-buttons no-click-sfx">
<<button "Your home">>
<<goto "not your own">>
<</button>>
</div>
</div>''<<silently>>
<<set _mishanState = setup.mishan.ensureState()>>
<<set _operationId = String($pendingMishanFederationOperation || (_mishanState.lastFederationOperation ? _mishanState.lastFederationOperation.type : ""))>>
<<set _result = $pendingMishanFederationOperationResult || setup.mishan.commitFederationOperation(_operationId)>>
<<set _cohesionBefore = _result ? Number(_result.cohesionBefore ?? (Number(_result.remainingCohesion || 0) + Number(_result.cohesionSpent || 0))) : 0>>
<<set _scene = _result and _result.ok ? setup.mishan.getFederationOperationScene(_result) : null>>
<<set $pendingMishanFederationOperation = null>>
<<set $pendingMishanFederationOperationResult = null>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-federation-result-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Federation Channel</div>
<div class="mishan-federation-title">Operation Committed</div>
<div class="mishan-federation-subtitle">The allied tribes have accepted their shared task.</div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result and _result.ok>>
<<if _result.operationId is "disrupt_tribute" or _result.operationId is "disrupt_extraction">>
<div @class="'mishan-federation-result-copy is-' + _result.operationId.replace('_', '-')">
<div class="mishan-federation-operation-prose">
<p><<print setup.mishan.escapeHtml(_scene.setup)>></p>
<div class="mishan-federation-operation-dialogue">
<div class="mishan-federation-operation-speaker"><<print setup.mishan.escapeHtml(_scene.leaderName)>>:</div>
<div class="mishan-federation-operation-dialogue-line">"<<print setup.mishan.escapeHtml(_scene.dialogue)>>"</div>
</div>
<p><<print setup.mishan.escapeHtml(_scene.preparation)>></p>
<div class="mishan-federation-operation-outcome-prose">
<<for _proseParagraph range _scene.outcomeParagraphs>><p><<print setup.mishan.escapeHtml(_proseParagraph)>></p><</for>>
</div>
</div>
<section @class="'mishan-federation-result-outcome is-' + _result.outcomeTier" aria-label="Primary operation result">
<div class="mishan-federation-result-tier"><<print _result.outcomeLabel>></div>
<div class="mishan-federation-result-outcome-title"><<if _result.operationId is "disrupt_tribute">>Tribute Network Disrupted<<else>>Extraction Network Disrupted<</if>></div>
<div class="mishan-federation-result-outcome-effect"><<if _result.operationId is "disrupt_tribute">>Tributary Authority reduced by <<print _result.disruptionReductionPercent>>%<<else>>Outpost Resource income reduced by <<print _result.disruptionReductionPercent>>%<</if>></div>
</section>
<section class="mishan-federation-result-payoff" aria-label="Economic disruption">
<div class="mishan-federation-result-section-label"><<if _result.operationId is "disrupt_tribute">>Tribute Authority<<else>>Extraction Income<</if>></div>
<<if _result.operationId is "disrupt_tribute">>
<div class="mishan-federation-result-payoff-flow">
<div class="mishan-federation-result-payoff-value"><span>Expected next tribute</span><strong>+<<print _result.expectedAuthorityTribute>> Authority</strong></div>
<span class="mishan-federation-result-payoff-arrow" aria-hidden="true">→</span>
<div class="mishan-federation-result-payoff-value"><span>After disruption</span><strong>+<<print _result.effectiveAuthorityTribute>> Authority</strong></div>
</div>
<div class="mishan-federation-result-payoff-primary"><<print _result.disruptionReductionPercent>>% reduction · <<if _result.disruptionCollections is 1>>Next collection<<else>>Next <<print _result.disruptionCollections>> collections<</if>></div>
<<else>>
<div class="mishan-federation-result-payoff-flow">
<div class="mishan-federation-result-payoff-value"><span>Current Outpost income</span><strong>+<<print _result.rawOutpostIncome>> Resources/turn</strong></div>
<span class="mishan-federation-result-payoff-arrow" aria-hidden="true">→</span>
<div class="mishan-federation-result-payoff-value"><span>After disruption</span><strong>+<<print _result.effectiveOutpostIncome>> Resources/turn</strong></div>
</div>
<div class="mishan-federation-result-payoff-primary"><<print _result.disruptionReductionPercent>>% reduction · <<print _result.disruptionDuration>> turns</div>
<</if>>
</section>
<section class="mishan-federation-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<<print setup.mishan.renderDivineSignsImpact(_result)>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Federation Cohesion</div>
<div class="mishan-federation-impact-flow"><strong><<print _cohesionBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.remainingCohesion>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.cohesionSpent>> Cohesion</div>
</div>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.angerBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.angerAfter>></strong></div>
<div class="mishan-federation-impact-delta"><<if _result.angerDelta >= 0>>+<</if>><<print _result.angerDelta>> Anger</div>
</div>
<<if _result.relationsDelta < 0>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Relations</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.participatingTribeName)>></span><strong><<print _result.relationsDelta>></strong></div>
</div>
<</if>>
<<if _result.populationLoss > 0>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Losses</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.participatingTribeName)>></span><strong>-<<print _result.populationLoss>></strong></div>
<<if _result.participatingTribeDestroyed>><div class="mishan-federation-impact-note">The tribe did not survive.</div><</if>>
</div>
<</if>>
</div>
</section>
<<if _result.hasCheckBreakdown>>
<div class="mishan-federation-result-check" aria-label="Operation check breakdown">
<div class="mishan-federation-result-check-label">Check Details</div>
<<if _result.operationId is "disrupt_tribute">>
<span>Stewardship <strong><<print _result.stewardship>></strong></span>
<span>+ Leadership <strong><<print _result.leadership>></strong> ÷ 2 (<strong><<print _result.leadershipContribution>></strong>)</span>
<<else>>
<span>Strength <strong><<print _result.strength>></strong></span>
<span>+ Stewardship <strong><<print _result.stewardship>></strong> ÷ 2 (<strong><<print _result.stewardshipContribution>></strong>)</span>
<</if>>
<span>+ d20 <strong><<print _result.d20>></strong></span>
<span>= <strong><<print _result.checkTotal>></strong> vs DC <strong><<print _result.checkDc>></strong></span>
</div>
<</if>>
</div>
<<elseif _result.operationId is "joint_reconnaissance">>
<div class="mishan-federation-result-copy is-joint-reconnaissance">
<div class="mishan-federation-operation-prose">
<p><<print setup.mishan.escapeHtml(_scene.setup)>></p>
<div class="mishan-federation-operation-dialogue">
<div class="mishan-federation-operation-speaker"><<print setup.mishan.escapeHtml(_scene.leaderName)>>:</div>
<div class="mishan-federation-operation-dialogue-line">"<<print setup.mishan.escapeHtml(_scene.dialogue)>>"</div>
</div>
<p><<print setup.mishan.escapeHtml(_scene.preparation)>></p>
<div class="mishan-federation-operation-outcome-prose">
<<for _proseParagraph range _scene.outcomeParagraphs>><p><<print setup.mishan.escapeHtml(_proseParagraph)>></p><</for>>
</div>
</div>
<section @class="'mishan-federation-result-outcome is-' + _result.outcomeTier" aria-label="Primary operation result">
<div class="mishan-federation-result-tier"><<print _result.outcomeLabel>></div>
<div class="mishan-federation-result-outcome-title">Joint Reconnaissance</div>
<div class="mishan-federation-result-outcome-effect"><<if _result.preparednessDelta > 0>>Preparedness +<<print _result.preparednessDelta>><<else>>No useful intelligence recovered.<</if>></div>
</section>
<section class="mishan-federation-result-payoff" aria-label="Reconnaissance payoff">
<div class="mishan-federation-result-section-label">Reconnaissance Effect</div>
<<if _result.preparednessDelta > 0>>
<div class="mishan-federation-result-payoff-primary">Preparedness +<<print _result.preparednessDelta>></div>
<<else>>
<div class="mishan-federation-result-payoff-primary is-muted">No Preparedness gained.</div>
<</if>>
</section>
<section class="mishan-federation-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<<print setup.mishan.renderDivineSignsImpact(_result)>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Federation Cohesion</div>
<div class="mishan-federation-impact-flow"><strong><<print _cohesionBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.remainingCohesion>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.cohesionSpent>> Cohesion</div>
</div>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.angerBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.angerAfter>></strong></div>
<div class="mishan-federation-impact-delta">+<<print _result.angerDelta>> Anger</div>
</div>
<<if _result.relationsDelta < 0>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Relations</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.participatingTribeName)>></span><strong><<print _result.relationsDelta>></strong></div>
</div>
<</if>>
<<if _result.populationLoss > 0>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Losses</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.participatingTribeName)>></span><strong>-<<print _result.populationLoss>></strong></div>
<<if _result.participatingTribeDestroyed>><div class="mishan-federation-impact-note">The tribe did not survive.</div><</if>>
</div>
<</if>>
</div>
</section>
<<if _result.hasCheckBreakdown>>
<div class="mishan-federation-result-check" aria-label="Operation check breakdown">
<div class="mishan-federation-result-check-label">Check Details</div>
<span>Wisdom <strong><<print _result.wisdom>></strong></span>
<span>+ Leadership <strong><<print _result.leadership>></strong> ÷ 2 (<strong><<print _result.leadershipContribution>></strong>)</span>
<span>+ d20 <strong><<print _result.d20>></strong></span>
<span>= <strong><<print _result.checkTotal>></strong> vs DC <strong><<print _result.checkDc>></strong></span>
</div>
<</if>>
</div>
<<elseif _result.operationId is "harass_walled_lands">>
<div class="mishan-federation-result-copy is-harass-walled-lands">
<div class="mishan-federation-operation-prose">
<p><<print setup.mishan.escapeHtml(_scene.setup)>></p>
<div class="mishan-federation-operation-dialogue">
<div class="mishan-federation-operation-speaker"><<print setup.mishan.escapeHtml(_scene.leaderName)>>:</div>
<div class="mishan-federation-operation-dialogue-line">"<<print setup.mishan.escapeHtml(_scene.dialogue)>>"</div>
</div>
<p><<print setup.mishan.escapeHtml(_scene.preparation)>></p>
<div class="mishan-federation-operation-outcome-prose">
<<for _proseParagraph range _scene.outcomeParagraphs>><p><<print setup.mishan.escapeHtml(_proseParagraph)>></p><</for>>
</div>
</div>
<section @class="'mishan-federation-result-outcome is-' + _result.outcomeTier" aria-label="Primary operation result">
<div class="mishan-federation-result-tier"><<print _result.outcomeLabel>></div>
<div class="mishan-federation-result-outcome-title"><<print setup.mishan.escapeHtml(_result.outcomeTitle)>></div>
<div class="mishan-federation-result-outcome-effect">Harass the Walled Lands</div>
</section>
<section class="mishan-federation-result-payoff" aria-label="Raid payoff">
<div class="mishan-federation-result-section-label">Strategic Result</div>
<div class="mishan-federation-result-payoff-list">
<<if not _mishanState.situations.ruleConsolidation.resolved>>
<span><strong>Consolidation of Rule:</strong> <<if _result.ruleSetbackApplicable>><<print setup.mishan.escapeHtml(_result.ruleSetbackText)>><<else>>No setback.<</if>></span>
<</if>>
<<if _result.hasLoot>>
<span><strong>Spoils:</strong>
<<if _result.foodLoot > 0>>+<<print _result.foodLoot>> Food<</if>>
<<if _result.resourceLoot > 0>><<if _result.foodLoot > 0>> · <</if>>+<<print _result.resourceLoot>> Resources<</if>>
<<if _result.goodsLoot > 0>><<if _result.foodLoot > 0 or _result.resourceLoot > 0>> · <</if>>+<<print _result.goodsLoot>> Goods<</if>>
</span>
<<else>>
<span>No spoils were recovered.</span>
<</if>>
</div>
</section>
<section class="mishan-federation-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<<print setup.mishan.renderDivineSignsImpact(_result)>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Federation Cohesion</div>
<div class="mishan-federation-impact-flow"><strong><<print _cohesionBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.remainingCohesion>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.cohesionSpent>> Cohesion</div>
</div>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.angerBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.angerAfter>></strong></div>
<div class="mishan-federation-impact-delta">+<<print _result.angerDelta>> Anger</div>
</div>
<<if _result.relationsDelta < 0>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Relations</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.participatingTribeName)>></span><strong><<print _result.relationsDelta>></strong></div>
</div>
<</if>>
<<if _result.hasCasualties>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Losses</div>
<<for _casualty range _result.casualties>>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_casualty.label)>></span><strong>-<<print _casualty.loss>></strong></div>
<<if _casualty.destroyed>><div class="mishan-federation-impact-note"><<print setup.mishan.escapeHtml(_casualty.label)>> did not survive.</div><</if>>
<</for>>
</div>
<</if>>
<div class="mishan-federation-impact-item">
<div class="mishan-federation-impact-label">Retaliation Pressure</div>
<div class="mishan-federation-impact-row"><span>Mishan response</span><strong><<print setup.mishan.escapeHtml(_result.retaliationSeverity.charAt(0).toUpperCase() + _result.retaliationSeverity.slice(1))>></strong></div>
</div>
</div>
</section>
<<if _result.hasCheckBreakdown>>
<div class="mishan-federation-result-check" aria-label="Operation check breakdown">
<div class="mishan-federation-result-check-label">Check Details</div>
<span class="mishan-federation-result-check-assessment">Federation force: <strong><<print setup.mishan.escapeHtml(_result.militaryAssessmentLabel)>></strong> compared with Mishan (<<if _result.militaryStrengthModifier >= 0>>+<</if>><<print _result.militaryStrengthModifier>>)</span>
<span>Leadership <strong><<print _result.leadership>></strong></span>
<span>+ Strength <strong><<print _result.strength>></strong> ÷ 2 (<strong><<print _result.strengthContribution>></strong>)</span>
<span>+ d20 <strong><<print _result.d20>></strong></span>
<span><<if _result.militaryStrengthModifier >= 0>>+<</if>> Military <strong><<if _result.militaryStrengthModifier >= 0>>+<</if>><<print _result.militaryStrengthModifier>></strong></span>
<span>= <strong><<print _result.checkTotal>></strong> vs DC <strong><<print _result.checkDc>></strong></span>
</div>
<</if>>
</div>
<<else>>
<div class="mishan-federation-result-copy">
<div class="mishan-federation-placeholder-label">Temporary Step 1 Resolution</div>
<div><<print setup.mishan.escapeHtml(_result.placeholderText)>></div>
<div class="mishan-federation-result-grid">
<div class="mishan-federation-result-stat"><span>Operation</span><strong><<print setup.mishan.escapeHtml(_result.label)>></strong></div>
<div class="mishan-federation-result-stat"><span>Cohesion Spent</span><strong>-<<print _result.cohesionSpent>></strong></div>
<div class="mishan-federation-result-stat"><span>Cohesion Remaining</span><strong><<print _result.remainingCohesion>></strong></div>
</div>
</div>
<</if>>
<<else>>
<div class="mishan-federation-result-copy mishan-federation-error">
The operation could not be committed. <<if _result and _result.reason>><<print setup.mishan.escapeHtml(_result.reason)>><</if>>
</div>
<</if>>
</div>
<div class="mishan-federation-footer">
<span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">>
<<set $activeTribeId = setup.mishan.getTribeId()>>
<<set $selectedTribeId = setup.mishan.getTribeId()>>
<<goto "Tribe_Info">>
<</button>></span>
</div>
</div>
<</nobr>><<silently>>
<<set _operations = setup.mishan.getFederationOperationViews()>>
<<set _cohesion = setup.mishan.getFederationCohesion()>>
<<set _slotUsed = setup.mishan.hasUsedFederationOperationThisTurn()>>
<<set _council = setup.mishan.getFederationCouncilIntroView()>>
<<set $pendingMishanFederationOperation = null>>
<<set $pendingMishanFederationOperationResult = null>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Federation Channel</div>
<div class="mishan-federation-title">Coordinate Federation</div>
<div class="mishan-federation-subtitle">Commit the allied tribes to one coordinated operation this turn.</div>
</header>
<section class="mishan-federation-council-scene" aria-label="Federation council gathering">
<p>Mishan becomes more dangerous with every season they are left undisturbed. The chieftains of <strong><<print setup.mishan.escapeHtml(_council.federationName)>></strong> gather to decide what course to take against their increasingly aggressive neighbour.</p>
<<if _council.leaders.length >= 2>>
<p><strong><<print setup.mishan.escapeHtml(_council.leaders[0].leaderName)>>, Chieftain of <<print setup.mishan.escapeHtml(_council.leaders[0].tribeName)>></strong>, <<print setup.mishan.escapeHtml(_council.leaders[0].action)>>. Nearby, <strong><<print setup.mishan.escapeHtml(_council.leaders[1].leaderName)>>, Chieftain of <<print setup.mishan.escapeHtml(_council.leaders[1].tribeName)>></strong>, <<print setup.mishan.escapeHtml(_council.leaders[1].action)>>. The others settle around them in uneasy silence.</p>
<<elseif _council.leaders.length is 1>>
<p><strong><<print setup.mishan.escapeHtml(_council.leaders[0].leaderName)>>, Chieftain of <<print setup.mishan.escapeHtml(_council.leaders[0].tribeName)>></strong>, <<print setup.mishan.escapeHtml(_council.leaders[0].action)>>, while the rest of the gathering settles into uneasy silence.</p>
<<else>>
<p>The gathering settles into uneasy silence.</p>
<</if>>
<p>Everyone waits for your word, more than a few plainly eager for the chance to bloody Mishan's nose.</p>
</section>
<div class="mishan-federation-status">
<div><span>Current Cohesion</span><strong><<print _cohesion>></strong></div>
<div><span>Federation Operation</span><strong><<print _slotUsed ? "Used this turn" : "Available">></strong></div>
</div>
<div class="mishan-federation-operations-scroll">
<div class="mishan-federation-operation-grid">
<<for _i = 0; _i < _operations.length; _i++>>
<<set _op = _operations[_i]>>
<article @class="'mishan-federation-operation' + (_op.enabled ? '' : ' is-disabled')">
<h2><<print setup.mishan.escapeHtml(_op.label)>></h2>
<p><<print setup.mishan.escapeHtml(_op.description)>></p>
<div class="mishan-federation-cost">Cost: <strong><<print _op.cost>> Cohesion</strong></div>
<div class="mishan-federation-operation-action">
<<if _op.enabled>>
<<capture _op>>
<span class="mishan-action-tip is-enabled"><<button "Commit Operation">>
<<set $pendingMishanFederationOperation = _op.id>>
<<set $pendingMishanFederationOperationResult = setup.mishan.commitFederationOperation(_op.id)>>
<<goto "Mishan_FederationOperationResult">>
<</button>></span>
<</capture>>
<<else>>
<span class="mishan-action-tip ti-btn-tip is-disabled" tabindex="0" @data-tip="_op.reason"><span class="macro-button disabled" role="button" aria-disabled="true">Unavailable</span></span>
<</if>>
</div>
</article>
<</for>>
</div>
</div>
<div class="mishan-federation-footer">
<span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">>
<<set $activeTribeId = setup.mishan.getTribeId()>>
<<set $selectedTribeId = setup.mishan.getTribeId()>>
<<goto "Tribe_Info">>
<</button>></span>
</div>
</div>
<</nobr>><<silently>>
<<set _result = setup.mishan.resolveCampaignAction("lay_low")>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-federation-result-shell mishan-lay-low-result-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Direct Action</div>
<div class="mishan-federation-title">Lay Low</div>
<div class="mishan-federation-subtitle">For a time, you give Mishan no reason to look your way.</div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result and _result.ok>>
<div class="mishan-federation-result-copy mishan-lay-low-result-copy">
<div class="mishan-federation-operation-prose">
<p>For a time, you leave Mishan alone. No caravans are struck, no warriors are sent toward their lands, and no attempt is made to test their patience further.</p>
<p>Whatever else occupies your attention, Kavonok is given nothing new to take offense at.</p>
</div>
<section class="mishan-federation-result-outcome mishan-lay-low-result-outcome is-accepted" aria-label="Primary Lay Low result">
<div class="mishan-federation-result-outcome-title">Mishan Left Undisturbed</div>
<div class="mishan-federation-result-outcome-effect">Kavonok's anger cools.</div>
</section>
<section class="mishan-federation-impact mishan-tribute-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<div class="mishan-federation-impact-item is-benefit">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforeAnger>></strong><span aria-hidden="true">→</span><strong><<print _result.afterAnger>></strong></div>
<div class="mishan-federation-impact-delta"><<print _result.angerDelta>> Anger</div>
</div>
<<print setup.mishan.renderDivineSignsImpact(_result)>>
</div>
</section>
</div>
<<else>>
<div class="mishan-federation-result-copy mishan-federation-error">
Lay Low cannot be used right now. <<if _result and _result.reason>><<print setup.mishan.escapeHtml(_result.reason)>><</if>>
</div>
<</if>>
</div>
<div class="mishan-federation-footer">
<span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">>
<<set $activeTribeId = setup.mishan.getTribeId()>>
<<set $selectedTribeId = setup.mishan.getTribeId()>>
<<goto "Tribe_Info">>
<</button>></span>
</div>
</div>
<</nobr>><<silently>>
<<set _result = setup.mishan.resolveObserveMishan()>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-federation-result-shell mishan-observe-result-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Reconnaissance</div>
<div class="mishan-federation-title">Observe Mishan</div>
<div class="mishan-federation-subtitle">You study the signs Mishan leaves beyond its walls.</div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result and _result.ok>>
<div class="mishan-federation-result-copy mishan-observe-result-copy">
<div class="mishan-federation-operation-prose">
<<if _result.outcomeId is "tayan">>
<p>Something about one group leaving Mishan catches your attention.</p>
<p>There are warriors among them, but the man at their center is not dressed like one. He carries no great spear, no trophies, nothing that marks him as one of Kavonok's fighters.</p>
<p>Yet the others move around him.</p>
<p>When he stops, they stop. When he changes direction, they follow. More than once, one of the warriors moves ahead before allowing him to pass.</p>
<p>Six armed men for someone who does not appear to be a warrior at all.</p>
<p>Whoever he is, Mishan considers him worth protecting.</p>
<p>Your scouts keep their distance and follow.</p>
<<else>>
<p>You turn your attention toward Mishan.</p>
<p>Rather than test their walls directly, you watch. Patrols are followed from a distance. Tracks are measured against older tracks. Smoke, movement, and the paths taken by those coming and going from the walled lands are committed to memory.</p>
<p>Even a fortress leaves signs beyond its walls.</p>
<<if _result.outcomeId is "locate_extraction_outpost" and _result.success>>
<p>One pattern stands apart from the others.</p><p>A group leaving Mishan follows the expected road only briefly before breaking away toward rougher country. You keep your distance and follow the signs they leave behind.</p><p>They are not merely patrolling.</p><p>Beyond the usual routes sits a smaller Mishan camp: guarded, supplied, and positioned where the surrounding land can be stripped of what the fortress needs.</p><p>You mark its location carefully.</p><p>Mishan is larger than its walls. That also means there is more of it to hurt.</p>
<<elseif _result.outcomeId is "locate_extraction_outpost">>
<p>The patrol you were following disappears.</p><p>By the time you find its trail again, there is little chance of learning what you originally came for. Instead, the tracks lead somewhere you did not expect.</p><p>Smoke rises beyond the normal Mishan routes. More tracks converge there. Workers, guards, and supplies move between the place and the fortress.</p><p>You may have lost the patrol.</p><p>You have found something better.</p><p>A Mishan outpost.</p>
<<elseif _result.outcomeId is "watch_has_a_rhythm">>
<p>Something in the watch begins to stand out.</p><p>The same warriors return to the same stretches of wall. Some paths are watched closely for a time, then left almost alone until the next patrol comes through. What first seemed restless and irregular begins to reveal a rhythm.</p><p>It is no great weakness on its own, but Mishan's defences are a little less unknowable than they were before.</p>
<<elseif _result.outcomeId is "what_they_leave_behind">>
<p>Something else catches your scouts' attention.</p><p>For much of the day, Mishan workers carry bundles to a rough staging place beyond the walls. When they finally leave, they do so quickly, taking most of what they brought with them.</p><p>Most of what remains is worthless. Not all of it. Your scouts return with a handful of useful things Mishan apparently did not consider worth carrying back.</p>
<<elseif _result.outcomeId is "familiar_escort">>
<p>A pattern begins to emerge in the groups leaving Mishan.</p><p>Their caravans may differ in size and cargo, but the warriors around them do not move at random. The same positions are taken again and again. The same few men range ahead, while others remain close to the goods.</p><p>Your scouts have watched the routine often enough now to know where its attention is strongest — and where it is not.</p>
<<elseif _result.outcomeId is "tribute_collectors">>
<p>Then a small group leaves Mishan.</p><p>They carry weapons, but too few supplies for a long journey. Your scouts follow from a distance as the group moves away from the usual roads, stopping at several places before continuing on.</p><p>Whatever they are doing, they seem likely to remain in the area for only a short while.</p><p>Your scouts remember where they were headed.</p>
<<elseif _result.success>>
<p>Patterns begin to emerge.</p><p>Patrols that first seemed irregular begin repeating themselves. Certain paths see more traffic than others. Guards linger longer in some places and hurry through others.</p><p>None of it is enough to bring Mishan down on its own. But piece by piece, the fortress becomes a little less unknowable.</p>
<<else>>
<p>You learn something, though less than you had hoped.</p><p>Mishan's movements refuse to settle into any pattern you can trust. Trails disappear beneath one another, patrols change direction without warning, and several promising observations lead nowhere.</p><p>Still, wasted effort is not the same as learning nothing.</p>
<</if>>
<<if not _result.success and _result.angerDelta > 0>><p>Worse, at least once, a Mishan patrol stops where it should have kept walking. Whether they saw one of your people or merely found a sign left behind, someone has noticed that the lands around Mishan are being watched.</p><</if>>
<</if>>
</div>
<section class="mishan-federation-result-outcome mishan-observe-result-outcome <<if _result.success>>is-success<<else>>is-failure<</if>>" aria-label="Primary Observe Mishan result">
<<if _result.outcomeId is not "tayan">><div class="mishan-federation-result-tier">Wisdom Check · <<if _result.success>>Success<<else>>Failure<</if>></div><</if>>
<div class="mishan-federation-result-outcome-title"><<print setup.mishan.escapeHtml(_result.outcomeLabel)>></div>
<div class="mishan-federation-result-outcome-effect"><<if _result.discoveryOccurred>>Outpost <<print _result.discoveredOutpostSerial>> · <<print setup.mishan.escapeHtml(_result.discoveredOutpostTerrainName)>> · Tile <<print _result.discoveredOutpostX>>, <<print _result.discoveredOutpostY>><<elseif _result.outcomeId is "what_they_leave_behind">>Resources +<<print _result.resourcesDelta>> · Goods +<<print _result.goodsDelta>><<elseif _result.outcomeId is "familiar_escort">>Raid Caravan · Reconnaissance +2 through Turn <<print _result.reconnaissanceExpiresAfterTurn>><<elseif _result.outcomeId is "tayan">>Task added - Follow the guarded Mishan<<elseif _result.outcomeId is "tribute_collectors">>Task added · <<print _result.questTurnsRemaining>> turns remaining<<else>>Preparedness +<<print _result.preparednessDelta>><</if>></div>
</section>
<section class="mishan-federation-impact mishan-tribute-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<div class="mishan-federation-impact-item is-benefit"><div class="mishan-federation-impact-label">Preparedness</div><div class="mishan-federation-impact-flow"><strong><<print _result.beforePreparedness>></strong><span aria-hidden="true">→</span><strong><<print _result.afterPreparedness>></strong></div><div class="mishan-federation-impact-delta">+<<print _result.preparednessDelta>> Preparedness</div></div>
<<if _result.angerDelta > 0>><div class="mishan-federation-impact-item is-cost"><div class="mishan-federation-impact-label">Mishan Anger</div><div class="mishan-federation-impact-flow"><strong><<print _result.beforeAnger>></strong><span aria-hidden="true">→</span><strong><<print _result.afterAnger>></strong></div><div class="mishan-federation-impact-delta">+<<print _result.angerDelta>> Anger</div></div><</if>>
<<if _result.resourcesDelta > 0>><div class="mishan-federation-impact-item is-benefit"><div class="mishan-federation-impact-label">Recovered Materials</div><div class="mishan-federation-impact-row"><span>Resources</span><strong>+<<print _result.resourcesDelta>></strong></div><div class="mishan-federation-impact-row"><span>Goods</span><strong>+<<print _result.goodsDelta>></strong></div></div><</if>>
<<if _result.discoveryOccurred>><div class="mishan-federation-impact-item is-benefit"><div class="mishan-federation-impact-label">Discovery</div><div class="mishan-federation-impact-row"><span>Extraction Outpost <<print _result.discoveredOutpostSerial>></span><strong>Located</strong></div></div><</if>>
<<if _result.reconnaissanceModifier > 0>><div class="mishan-federation-impact-item is-benefit"><div class="mishan-federation-impact-label">Reconnaissance</div><div class="mishan-federation-impact-row"><span>Next Raid Caravan</span><strong>+2</strong></div><div class="mishan-federation-impact-delta">Available for the next four subsequent turns</div></div><</if>>
<<if _result.questCreated>><div class="mishan-federation-impact-item is-benefit"><div class="mishan-federation-impact-label">New Opportunity</div><div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.questName)>></span><strong>Added</strong></div><div class="mishan-federation-impact-delta"><<print _result.questTurnsRemaining>> turns remaining</div></div><</if>>
</div>
</section>
<div class="mishan-federation-result-check" aria-label="Observe Mishan check breakdown"><div class="mishan-federation-result-check-label">Check Details</div><span>Wisdom <strong><<print _result.wisdom>></strong></span><span>+ d20 <strong><<print _result.d20>></strong></span><span>= <strong><<print _result.checkTotal>></strong> vs DC <strong><<print _result.checkDc>></strong></span></div>
</div>
<<else>><div class="mishan-federation-result-copy mishan-federation-error">Observe Mishan cannot be used right now. <<if _result and _result.reason>><<print setup.mishan.escapeHtml(_result.reason)>><</if>></div><</if>>
</div>
<div class="mishan-federation-footer"><span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">><<set $activeTribeId = setup.mishan.getTribeId()>><<set $selectedTribeId = setup.mishan.getTribeId()>><<goto "Tribe_Info">><</button>></span></div>
</div>
<</nobr>><<silently>>
<<set _mishan = setup.mishan.ensureState()>>
<<set _requirement = setup.mishan.getPrepareAssaultRequirement(_mishan.preparedness, _mishan)>>
<<set _eligible = !!(_mishan.active and !_mishan.defeated and !_mishan.warHostActive and _requirement.meetsPreparedness)>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-strike-shell mishan-strike-result-shell">
<header class="mishan-federation-header">
<div><span class="mishan-federation-kicker">Mishan Campaign</span><h1>Prepare the Assault</h1><p>Your preparations are sufficient. Once you give the order, the currently implemented Mishan campaign will conclude.</p></div>
</header>
<div class="mishan-federation-result-scroll">
<section class="mishan-federation-result-copy">
<<if _eligible>>
<h2>The time has come.</h2>
<p>Your scouts know the roads, your warriors know the walls, and the tribes under Mishan rule are waiting to see whether Kavonok can be broken.</p>
<p>The final assault on Mishan is still in development.</p>
<p>Proceeding will mark Mishan as defeated, complete Getting Even, remove their extraction outposts, and free their tributaries. No assault rewards are granted by this temporary endpoint.</p>
<<else>>
<h2>The assault cannot be prepared yet.</h2>
<p>You need at least <<print _requirement.minimum>>% Preparedness and an active Mishan campaign.</p>
<</if>>
</section>
<footer class="mishan-federation-footer">
<<if _eligible>><<button "Proceed with the Assault">><<goto "Mishan_TemporaryAssault_Result">><</button>><</if>>
<<button "Not Yet">><<goto "Tribe_Info">><</button>>
</footer>
</div>
</div>
<</nobr>><<run setup.mishan.finalizePunitiveRaid()>><<goto "Mishan_PunitiveRaid_Result">><<silently>>
<<set _order = setup.mishan.ensureState().pendingPunitiveRaid>>
<<set _isWarHost = _order and _order.raidType is "war_host">>
<<set $raidCtx = $raidCtx ?? {}>><<set $raidCtx.sourceTribeId = $raidCtx.sourceTribeId ?? setup.mishan.getTribeId()>><<set $raidCtx.sourceTribeName = "Mishan">><<set $raidCtx._active = true>>
<<set $mishanPunitiveRaidDefenseSetup = $mishanPunitiveRaidDefenseSetup ?? { prepChoice: "base", withdrawPlan: "normal", leader: "yourself" }>>
<<if _isWarHost and $mishanPunitiveRaidDefenseSetup.withdrawPlan is "ordered_withdrawal">><<set $mishanPunitiveRaidDefenseSetup.withdrawPlan = "normal">><</if>>
<<set _t = setup.mishan.getTribe()>>
<<if _t and !$raidCtx.federationDefenseAssist>><<set _fedAssist = setup.federation.rollDefenseAssistForRaid(_t, $raidCtx)>><</if>>
<<if setup.player and setup.player.recalcMilStr>><<run setup.player.recalcMilStr()>><</if>>
<<set _terrainData = setup.raidV1.getTerrainDataForCamp()>><<set _terrainLabel = _terrainData.label ?? "Open Ground">>
<<set _ourMil = Number($playerMilStr ?? 0)>><<set _ourPop = Math.floor(Number($pops ?? 0))>><<set _ourBands = setup.raidV1.getAvailableWarbandCount(_ourPop)>>
<<set _force = Math.max(1, Number(_order ? _order.committedWarbands : 3))>><<set _fortified = setup.raidV1.isPlayerDefenseFortifiedReady() ? true : false>>
<<set _prepDefs = setup.raidV1.getPrepChoiceDefs()>><<set _prepView = setup.raidV1.getDefensePrepSetupView($mishanPunitiveRaidDefenseSetup.prepChoice)>>
<<set _withdrawPlan = setup.raidV1.getDefensePosture($mishanPunitiveRaidDefenseSetup.withdrawPlan)>><<set _leaderView = setup.raidV1.getLeaderSetupView("yourself")>>
<</silently>>
<<if !_order>><div class="raidv1-wrap"><div class="raidv1-panel"><div class="raidv1-title">Raid order missing</div><p>The Mishan attack can no longer be reconstructed.</p></div></div><<else>>
<div class="raidv1-wrap raidv1-setupgrid">
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--summary">
<div class="raidv1-title"><<if _isWarHost>>The Mishan War Host<<else>>Defend The Camp<</if>></div>
<div class="raidv1-subtitle">Raiders: <b>Mishan</b> | Force: <b><<print _force>> warbands</b> | Camp Terrain: <b><<print _terrainLabel>></b></div>
<<if $raidCtx.federationDefenseAssist>><div class="raidv1-fedaid-notice"><div class="raidv1-fedaid-kicker">Federation Aid</div><h3 class="raidv1-fedaid-title">You don't fight alone!</h3><p class="raidv1-fedaid-copy">The <<print $raidCtx.federationDefenseAssist.tribeName>> have come to our aid! +5 cohesion. Their warriors join your defense as an allied warband.</p></div><</if>>
<div class="raidv1-summarybar">
<div class="raidv1-optioncard"><span class="raidv1-label">Your Military Strength</span><span class="raidv1-value"><<print _ourMil>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Your Warbands</span><span class="raidv1-value"><<print _ourBands>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Mishan Force</span><span class="raidv1-value"><<print _force>> warbands</span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">AP Cost</span><span class="raidv1-value">None</span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Camp Status</span><span class="raidv1-value"><<if _fortified>>Fortified<<else>>Exposed<</if>></span></div>
</div>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--commitment"><h3>Defense Posture</h3><div class="raidv1-chiprow">
<<for _id range (_isWarHost ? ["normal","last_stand"] : ["ordered_withdrawal","normal","last_stand"])>><<set _d = setup.raidV1.getDefensePosture(_id)>><<capture _id>>
<<if $mishanPunitiveRaidDefenseSetup.withdrawPlan is _id>><span class="raidv1-chip is-active"><<print _d.label>></span><<else>><<button _d.label>><<set $mishanPunitiveRaidDefenseSetup.withdrawPlan = _id>><<goto "Mishan_PunitiveRaid_Defense_Setup">><</button>><</if>>
<</capture>><</for>></div><div class="raidv1-selectionreadout"><strong><<print _withdrawPlan.label>></strong><p class="raidv1-subtitle"><<print _withdrawPlan.desc>></p></div></div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--approach"><h3>Preparation</h3><div class="raidv1-chiprow">
<<for _id range ["leadership","strength","spark","base"]>><<set _d = _prepDefs[_id]>><<capture _id>>
<<if _id is "spark" and !_d.available>><span class="raidv1-chip is-muted"><<print _d.label>> (<<print _d.cost>> Belief)</span>
<<elseif $mishanPunitiveRaidDefenseSetup.prepChoice is _id>><span class="raidv1-chip is-active"><<print _d.label>></span>
<<else>><<button _d.label>><<set $mishanPunitiveRaidDefenseSetup.prepChoice = _id>><<set $raidCtx.prepChoice = _id>><<goto "Mishan_PunitiveRaid_Defense_Setup">><</button>><</if>>
<</capture>><</for>></div><div class="raidv1-selectionreadout"><div class="raidv1-checkformula"><span>Opening Check</span><strong><<print _prepView.formula>></strong></div><p class="raidv1-subtitle"><<print _prepView.description>></p></div></div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--leader"><h3>Leader</h3><div class="raidv1-leaderpriority"><span class="raidv1-leaderpriority-name"><<print _leaderView.name>></span><span class="raidv1-leaderpriority-stat">Leadership <b><<print _leaderView.leadership>></b></span></div><p class="raidv1-subtitle">You stand with the defenders in person. Defense costs no AP.</p></div>
<div class="raidv1-panel raidv1-actionrow raidv1-setupactions"><<button "Begin Defense">><<run setup.mishan.startPunitiveRaidDefense($mishanPunitiveRaidDefenseSetup)>><<if $raidV1 and $raidV1.active>><<goto "Raid_V1_Battle">><<else>><<goto "Mishan_PunitiveRaid_Defense_Setup">><</if>><</button>></div>
</div><</if>><<silently>>
<<set _r = setup.mishan.finalizePunitiveRaid()>><<set $mishanPunitiveShowLog = $mishanPunitiveShowLog ?? false>><<set _logButton = $mishanPunitiveShowLog ? "Hide Battle Log" : "View Battle Log">>
<<set _sign = function(n){ return Number(n) > 0 ? "+" + Number(n) : String(Number(n) || 0); }>><</silently>>
<div class="raidv1-wrap raidv1-resultlayout"><div class="raidv1-panel raidv1-resultpanel">
<div class="raidv1-resultheader"><div class="raidv1-title"><<print _r.title>></div><p class="raidv1-resultlede"><<print _r.text>></p></div>
<div class="raidv1-summarybar raidv1-resultsummary">
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Your Population Losses</strong><span><<print _r.playerCasualties>></span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Mishan Population Losses</strong><span><<print _r.mishanCasualties>></span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Camp Stock Lost</strong><span><<print _r.campFoodLost>> food / <<print _r.campResLost>> resources / <<print _r.campGoodsLost>> goods</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Mishan Captives</strong><span><<print _r.anonymousCaptives>></span></div>
</div>
<div class="raidv1-resultbody"><div class="raidv1-resultsection"><h3>Campaign Effects</h3><div class="raidv1-resultgrid">
<div class="raidv1-resultcard"><strong>Stability</strong><span><<print _sign(_r.stabilityChange)>></span></div>
<div class="raidv1-resultcard"><strong>Zeal</strong><span><<print _sign(_r.zealChange)>></span></div>
<div class="raidv1-resultcard"><strong>Preparedness</strong><span><<print _sign(_r.preparednessChange)>></span></div>
<div class="raidv1-resultcard"><strong>Mishan Authority</strong><span><<print _sign(_r.authorityChange)>></span></div>
<div class="raidv1-resultcard"><strong>Mishan Officer</strong><span><<if _r.commanderCaptured>>Captured<<elseif _r.commanderKilled>>Killed<<elseif _r.enemyCommanderCleanup and !_r.enemyCommanderCleanup.preserved>>Escaped<<else>>Fate uncertain<</if>></span></div>
</div></div>
<<if $mishanPunitiveShowLog>><div class="raidv1-resultsection"><h3>Battle Log</h3><div class="raidv1-log"><<for _line range $raidV1.log>><div><<print _line>></div><</for>></div></div><</if>>
</div>
</div><div class="raidv1-panel raidv1-actionrow raidv1-actionrow--result"><<button _logButton>><<set $mishanPunitiveShowLog = !$mishanPunitiveShowLog>><<goto "Mishan_PunitiveRaid_Result">><</button>><<button "End Event">><<run setup.mishan.finishPunitiveRaidMajor()>><</button>></div></div><<silently>>
<<set _result = setup.mishan.resolveCampaignAction("raid_caravan")>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-federation-result-shell mishan-raid-caravan-result-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Military Pressure</div>
<div class="mishan-federation-title">Raid Caravan</div>
<div class="mishan-federation-subtitle">You lead a small raiding party against Mishan supply traffic.</div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result and _result.ok>>
<div class="mishan-federation-result-copy mishan-raid-caravan-result-copy">
<div class="mishan-federation-operation-prose">
<p>You leave camp with a small band before dawn, following reports of Mishan supply traffic moving between the Walled Lands and the surrounding countryside.</p>
<p>The caravan appears late in the day. Pack animals and loaded carts move along the watched road with a handful of laborers and an armed escort.</p>
<p>You wait until the road narrows and the surrounding ground gives your people somewhere to disappear into.</p>
<p>Then you give the signal.</p>
<<if _result.success>>
<p>The first rush catches the escort out of position. By the time the Mishan warriors form up, several carts are already in your hands and the rest of the caravan is breaking apart along the road.</p>
<p>Your people do not stay long. Anything useful is taken, anything too cumbersome to carry is spoiled, and the raiders vanish before a larger Mishan force can respond.</p>
<p>The markings on the captured loads and the escort's movements reveal a little more about how Mishan carries supplies through the region. Kavonok will hear what happened here.</p>
<<if _result.cargoType is "food">>
<p>Most of what your people carry away is food, packed for the road and meant for Mishan mouths.</p>
<<elseif _result.cargoType is "resources">>
<p>The richest carts are loaded with worked material, tools, bindings, and supplies useful around the camp.</p>
<<else>>
<p>One of the smaller carts proves more valuable than it first appeared, carrying compact trade goods and finished valuables.</p>
<</if>>
<<else>>
<p>The escort reacts almost immediately. Whatever surprise you had disappears as Mishan warriors close around the carts and force your people away from the road.</p>
<p>Your raiders damage part of the caravan before retreating, but there is no time to search the cargo or learn anything useful from it.</p>
<<if _result.playerPopulationLoss is 2>>
<p>Two of your people do not make it back. The survivors scatter into the countryside and return to camp by different routes, leaving damaged wagons and furious Mishan warriors behind them.</p>
<<elseif _result.playerPopulationLoss is 1>>
<p>One of your people does not make it back. The survivors scatter into the countryside and return to camp by different routes, leaving damaged wagons and furious Mishan warriors behind them.</p>
<<else>>
<p>The survivors scatter into the countryside and return to camp by different routes, leaving damaged wagons and furious Mishan warriors behind them.</p>
<</if>>
<</if>>
</div>
<section class="mishan-federation-result-outcome mishan-raid-caravan-result-outcome <<if _result.success>>is-success<<else>>is-failure<</if>>" aria-label="Primary Raid Caravan result">
<div class="mishan-federation-result-tier">Raid Check · <<if _result.success>>Success<<else>>Failure<</if>></div>
<div class="mishan-federation-result-outcome-title"><<if _result.success>>The Ambush Lands<<else>>The Escort Holds<</if>></div>
<div class="mishan-federation-result-outcome-effect"><<if _result.success>>+<<print _result.cargoAmount>> <<print setup.mishan.escapeHtml(_result.cargoLabel)>> captured<<else>><<print _result.playerPopulationLoss>> Population lost<</if>></div>
</section>
<section class="mishan-federation-impact mishan-tribute-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<div class="mishan-federation-impact-item <<if _result.preparednessDelta > 0>>is-benefit<</if>>">
<div class="mishan-federation-impact-label">Preparedness</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforePreparedness>></strong><span aria-hidden="true">→</span><strong><<print _result.afterPreparedness>></strong></div>
<div class="mishan-federation-impact-delta">+<<print _result.preparednessDelta>> Preparedness</div>
</div>
<div class="mishan-federation-impact-item is-cost">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforeAnger>></strong><span aria-hidden="true">→</span><strong><<print _result.afterAnger>></strong></div>
<div class="mishan-federation-impact-delta">+<<print _result.angerDelta>> Anger</div>
</div>
<div class="mishan-federation-impact-item is-benefit">
<div class="mishan-federation-impact-label">Mishan Resources</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforeResources>></strong><span aria-hidden="true">→</span><strong><<print _result.afterResources>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.resourceDamage>> Resources</div>
</div>
<<if _result.success>>
<div class="mishan-federation-impact-item is-benefit">
<div class="mishan-federation-impact-label">Loot</div>
<div class="mishan-federation-impact-row"><span><<print setup.mishan.escapeHtml(_result.cargoLabel)>></span><strong>+<<print _result.cargoAmount>></strong></div>
</div>
<<else>>
<div class="mishan-federation-impact-item is-cost">
<div class="mishan-federation-impact-label">Population</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.playerPopulationBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.playerPopulationAfter>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.playerPopulationLoss>> Population</div>
</div>
<</if>>
<<print setup.mishan.renderDivineSignsImpact(_result)>>
</div>
</section>
<div class="mishan-federation-result-check" aria-label="Raid Caravan check breakdown">
<div class="mishan-federation-result-check-label">Check Details</div>
<span>Roll <strong><<print _result.roll>></strong></span>
<span>+ Leadership <strong><<print _result.leadership>></strong></span>
<span>+ Half Strength <strong><<print _result.halfStrength>></strong></span>
<span>+ Military <strong><<print _result.militaryModifier>></strong> <small>(Mil Str <<print _result.militaryStrength>>)</small></span>
<<if _result.reconnaissanceModifier > 0>><span>+ Reconnaissance <strong><<print _result.reconnaissanceModifier>></strong></span><</if>>
<span>= <strong><<print _result.total>></strong> vs DC <strong><<print _result.finalDc>></strong></span>
<span class="mishan-federation-result-check-assessment">Consolidation: <strong><<print setup.mishan.escapeHtml(_result.consolidationStage)>></strong> (<<if _result.consolidationModifier >= 0>>+<</if>><<print _result.consolidationModifier>> DC)</span>
</div>
</div>
<<else>>
<div class="mishan-federation-result-copy mishan-federation-error">
Raid Caravan cannot be used right now. <<if _result and _result.reason>><<print setup.mishan.escapeHtml(_result.reason)>><</if>>
</div>
<</if>>
</div>
<div class="mishan-federation-footer">
<span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">>
<<set $activeTribeId = setup.mishan.getTribeId()>>
<<set $selectedTribeId = setup.mishan.getTribeId()>>
<<goto "Tribe_Info">>
<</button>></span>
</div>
</div>
<</nobr>><<silently>>
<<set _result = setup.mishan.resolveCampaignAction("send_tribute")>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-federation-result-shell mishan-tribute-result-shell">
<header class="mishan-federation-head">
<div class="mishan-federation-kicker">Mishan Campaign · Direct Action</div>
<div class="mishan-federation-title">Send Tribute</div>
<div class="mishan-federation-subtitle">An offering is sent to Mishan.</div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result and _result.ok>>
<div @class="'mishan-federation-result-copy mishan-tribute-result-copy is-' + _result.outcomeBand.replace('_', '-')">
<div class="mishan-federation-operation-prose mishan-tribute-result-prose">
<p>You have twenty-five Goods pulled from the stores and bundled together: worked tools, hides, ornaments, and anything else likely to carry value behind Mishan's walls.</p>
<p>A warrior is chosen to carry them. You give him a simple message for Kavonok. There is no threat or demand, only the offering and the understanding behind it. He takes one last look back at the camp before setting off toward Mishan beneath the weight of the gifts.</p>
<p>Now there is nothing to do but wait.</p>
<<if _result.outcomeBand is "accepted">>
<p>A few days later, the warrior you sent returns, tired and empty-handed.</p>
<p>The Mishan took everything. Kavonok never appeared before him personally, but the answer eventually came back through one of his warriors: the tribute had been accepted. Nothing more was asked of him.</p>
<p>He gives a tired shrug.</p>
<div class="mishan-federation-operation-dialogue">
<div class="mishan-federation-operation-speaker">Warrior:</div>
<div class="mishan-federation-operation-dialogue-line">“Could have gone worse.”</div>
</div>
<<elseif _result.outcomeBand is "envoy_killed">>
<p>A few days later, the warrior you sent still has not returned.</p>
<p>Another day passes, then another. Eventually, word reaches the camp that a Mishan patrol was seen carrying bundles matching those you sent toward the city.</p>
<p>The tribute reached Kavonok. Your warrior, apparently, did not earn the same welcome. No body or message is returned. Mishan simply keeps both the gifts and whatever became of the man who carried them.</p>
<<else>>
<p>A few days later, the warrior you sent still has not returned.</p>
<p>The answer comes soon enough. Hunters find a fresh wooden stake driven into the earth not far from camp, placed where it could hardly be missed. Your envoy's head has been impaled upon it, a strip of cloth from the tribute tied beneath.</p>
<p>The rest of the offering is gone.</p>
<p>Kavonok accepted your gifts.</p>
<p>And, it seems, he decided your generosity deserved a gift in return.</p>
<</if>>
</div>
<section @class="'mishan-federation-result-outcome mishan-tribute-result-outcome is-' + _result.outcomeBand.replace('_', '-')" aria-label="Primary tribute result">
<<if _result.outcomeBand is "accepted">>
<div class="mishan-federation-result-tier">Accepted</div>
<div class="mishan-federation-result-outcome-title">Tribute Accepted</div>
<div class="mishan-federation-result-outcome-effect">The offering is taken without further price.</div>
<<elseif _result.outcomeBand is "envoy_killed">>
<div class="mishan-federation-result-tier">A Price Paid</div>
<div class="mishan-federation-result-outcome-title">Envoy Does Not Return</div>
<div class="mishan-federation-result-outcome-effect">The offering is taken. Its bearer is not returned.</div>
<<else>>
<div class="mishan-federation-result-tier">Kavonok's Answer</div>
<div class="mishan-federation-result-outcome-title">A Message Sent Back</div>
<div class="mishan-federation-result-outcome-effect">The offering is taken. Kavonok sends his answer.</div>
<</if>>
</section>
<section class="mishan-federation-impact mishan-tribute-impact" aria-label="Impact Summary">
<div class="mishan-federation-result-section-label">Impact Summary</div>
<div class="mishan-federation-impact-grid">
<div class="mishan-federation-impact-item is-cost">
<div class="mishan-federation-impact-label">Goods</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforeGoods>></strong><span aria-hidden="true">→</span><strong><<print _result.afterGoods>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.goodsSpent>> Goods</div>
</div>
<div class="mishan-federation-impact-item is-benefit">
<div class="mishan-federation-impact-label">Mishan Anger</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.beforeAnger>></strong><span aria-hidden="true">→</span><strong><<print _result.afterAnger>></strong></div>
<div class="mishan-federation-impact-delta"><<print _result.angerDelta>> Anger</div>
</div>
<<if _result.playerPopulationLoss > 0>>
<div class="mishan-federation-impact-item is-cost">
<div class="mishan-federation-impact-label">Population</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.playerPopulationBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.playerPopulationAfter>></strong></div>
<div class="mishan-federation-impact-delta">-<<print _result.playerPopulationLoss>> Population</div>
</div>
<</if>>
<<if _result.zealDelta < 0>>
<div class="mishan-federation-impact-item is-cost">
<div class="mishan-federation-impact-label">Zeal</div>
<div class="mishan-federation-impact-flow"><strong><<print _result.zealBefore>></strong><span aria-hidden="true">→</span><strong><<print _result.zealAfter>></strong></div>
<div class="mishan-federation-impact-delta"><<print _result.zealDelta>> Zeal</div>
</div>
<</if>>
<<print setup.mishan.renderDivineSignsImpact(_result)>>
</div>
</section>
</div>
<<else>>
<div class="mishan-federation-result-copy mishan-federation-error">
Tribute cannot be sent right now. <<if _result and _result.reason>><<print setup.mishan.escapeHtml(_result.reason)>><</if>>
</div>
<</if>>
</div>
<div class="mishan-federation-footer">
<span class="mishan-action-tip is-enabled"><<button "Return to Mishan Info">>
<<set $activeTribeId = setup.mishan.getTribeId()>>
<<set $selectedTribeId = setup.mishan.getTribeId()>>
<<goto "Tribe_Info">>
<</button>></span>
</div>
</div>
<</nobr>><div id="mishan-strike-outpost-root"></div><<run setup.mishan.finalizeStrikeOutpostRaid()>><<goto "Mishan_StrikeOutpost_Result">><div id="mishan-strike-outpost-result-root"></div><<silently>>
<<set _result = setup.mishan.resolveTemporaryAssault()>>
<</silently>>
<<nobr>>
<div class="mishan-federation-shell mishan-strike-shell mishan-strike-result-shell">
<header class="mishan-federation-header">
<div><span class="mishan-federation-kicker">Mishan Campaign</span><h1><<if _result.ok>>Campaign Concluded<<else>>Assault Unavailable<</if>></h1><p><<if _result.ok>>The currently implemented Mishan campaign has reached its temporary endpoint.<<else>><<print _result.reason>><</if>></p></div>
</header>
<div class="mishan-federation-result-scroll">
<<if _result.ok>>
<section class="mishan-federation-result-copy"><h2>Mishan is defeated.</h2><p>Kavonok's campaign against your people is over for now. The world remains open, and your tribe may continue normally.</p></section>
<section class="mishan-strike-result-grid" style="width:100%;margin-top:12px" aria-label="Campaign resolution effects">
<div class="mishan-strike-result-card"><span>Quest</span><strong>Getting Even completed</strong></div>
<div class="mishan-strike-result-card"><span>Mishan</span><strong>Campaign concluded</strong></div>
<div class="mishan-strike-result-card"><span>Extraction Outposts</span><strong><<print _result.outpostsRemoved>> removed</strong></div>
<div class="mishan-strike-result-card"><span>Tributaries</span><strong><<print _result.tributariesFreed>> freed</strong></div>
</section>
<</if>>
<footer class="mishan-federation-footer"><<button "Return to Mishan Info">><<goto "Tribe_Info">><</button>></footer>
</div>
</div>
<</nobr>><<silently>><<set _r = setup.mishan.finalizeWarHostRaid()>><</silently>><<if _r.gameOver>><<run setup.mishan.enterWarHostGameOver()>><<goto "Game_Over_Mishan">><<else>><<goto "Mishan_WarHost_Result">><</if>><<silently>><<set _r = setup.mishan.finalizeWarHostRaid()>><</silently>>
<div class="raidv1-wrap raidv1-resultlayout"><div class="raidv1-panel raidv1-resultpanel"><div class="raidv1-title">The Camp Still Stands</div><div class="raidv1-resultsection">
<p>For several moments after the last Mishan formation breaks, nobody seems willing to believe that the fighting is actually over.</p>
<p>The survivors pulling away from the camp do so through a field that hardly resembles the ground they crossed that morning. Bodies lie among broken weapons and churned earth, Mishan and tribesman mixed together wherever the lines collapsed into one another. Some of your people watch the retreat, but few have enough strength left to pursue it very far.</p>
<p>Nine warbands came for your camp.</p><p>Somehow, enough of your people are still standing to call what happened a victory.</p>
<p>There is little celebration. The wounded are already being carried away, and those who can still move have begun searching the field for anyone who might yet be saved.</p>
<<if _r.canFormAnotherHost>><p>Scouts follow the retreat long enough to confirm what nobody in camp wants to hear.</p><p>The men who escaped are falling back toward the Walled Lands, but Mishan still has warriors enough to form another host.</p><p>You survived this one.</p><p>If Kavnok means to finish what he started, there will be another.</p>
<<else>><p>Scouts follow the survivors until nightfall.</p><p>What remains of the Mishan force does not regroup. No second column forms behind it, and no fresh body of warriors appears on the road.</p><p>Whether Kavnok has abandoned the attempt or simply lacks enough warriors to continue it hardly matters tonight.</p><p>Somehow, you are still here.</p><</if>>
<div class="raidv1-summarybar raidv1-resultsummary"><div class="raidv1-resultcard"><strong>Your Population Lost</strong><span><<print _r.playerCasualties>></span></div><<if _r.federationAssisted>><div class="raidv1-resultcard"><strong>Federation Population Lost</strong><span><<print _r.federationCasualties>></span></div><</if>><div class="raidv1-resultcard"><strong>Mishan Population Lost</strong><span><<print _r.mishanCasualties>></span></div></div></div></div>
<div class="raidv1-panel raidv1-actionrow raidv1-actionrow--result"><<button "Return to camp.">><<run setup.mishan.finishWarHostSurvival()>><</button>></div></div>...Or you will return to nothigness once more...<<silently>>
<<set _knownTribes = []>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<set _t = $tribes[_i]>>
<<if _t and ( !!_t.contacted or ($metTribeIds and $metTribeIds[_t.id]) or ($questTargetNpcCamps and $questTargetNpcCamps[_t.id]) )>>
<<set _knownTribes.push(_t)>>
<</if>>
<</for>>
<</if>>
<<set _knownCount = _knownTribes.length>>
<<set _displayKnownTribes = (setup.mishan and setup.mishan.prioritizeKnownTribes) ? setup.mishan.prioritizeKnownTribes(_knownTribes) : _knownTribes>>
<<set _contactedCount = _knownTribes.filter(t => !!t.contacted).length>>
<<set _fedCount = (setup.federation and setup.federation.hasFederation and setup.federation.hasFederation()) ? _knownTribes.filter(t => setup.federation.isMember and setup.federation.isMember(t.id)).length : 0>>
<<set _strongest = _knownCount ? _knownTribes.reduce((best,t) => Number(t.stats?.milStr ?? t.milStr ?? 0) > Number(best.stats?.milStr ?? best.milStr ?? 0) ? t : best, _knownTribes[0]) : null>>
<<set _mishanVisible = !!(setup.mishan and setup.mishan.isCampaignVisible and setup.mishan.isCampaignVisible())>>
<<set _strongestIsMishan = !!(_mishanVisible and _strongest and setup.mishan.isMishanId and setup.mishan.isMishanId(_strongest.id))>>
<<set _mishanOverview = _strongestIsMishan and setup.mishan.getTribeListView ? setup.mishan.getTribeListView() : null>>
<<set _raidThreat = null>>
<<set _raidThreatScore = -999999>>
<<if _knownCount>>
<<for _r = 0; _r < _knownTribes.length; _r++>>
<<set _rt = _knownTribes[_r]>>
<<set _rtid = String(_rt.id ?? "")>>
<<set _rtFed = !!(setup.federation and setup.federation.hasFederation and setup.federation.hasFederation() and setup.federation.isMember and setup.federation.isMember(_rtid))>>
<<set _rtPeace = !!(_rt.peaceActive or ($tribePeaceUntil and $tribePeaceUntil[_rtid] and Number($tribePeaceUntil[_rtid]) > Number($turn ?? 0)))>>
<<if _rt and _rt.contacted and !_rt.noSeasonAI and !_rt.noContactPlan and !_rtFed and !_rtPeace>>
<<set _rw = (setup.tribes and setup.tribes.computeProjectWeights) ? setup.tribes.computeProjectWeights(_rt) : null>>
<<set _raidScore = Number(_rw ? (_rw.raid_rival ?? 0) : 0) + (Number(_rt.stats?.milStr ?? _rt.milStr ?? 0) * 0.25) + (Math.max(0, 20 - Number(_rt.relations ?? 0)) * 0.05)>>
<<if _raidScore > _raidThreatScore>>
<<set _raidThreatScore = _raidScore>>
<<set _raidThreat = _rt>>
<</if>>
<</if>>
<</for>>
<</if>>
<</silently>>
<div class="othertribes-modern">
<div class="othertribes-head">
<div>
<div class="othertribes-kicker">Known Peoples</div>
<div class="othertribes-title">The Tribes</div>
<div class="othertribes-sub">Track nearby powers, read their mood, and choose who receives your attention next.</div>
</div>
<div class="othertribes-actions">
<<button "Return">><<goto "Hub_1">><</button>>
</div>
</div>
<div class="othertribes-overview">
<div class="othertribes-stat"><span>Known Tribes</span><strong><<print _knownCount>></strong></div>
<div class="othertribes-stat"><span>Federation</span><strong><<print _fedCount>></strong></div>
<div class="othertribes-stat"><span><<if _mishanVisible>>Normal Raid Risk<<else>>Raid Risk<</if>></span><strong><<if _raidThreat>><<print _raidThreat.name ?? "Unknown">><<else>>Low<</if>></strong></div>
<div class="othertribes-stat othertribes-stat-wide"><span><<if _strongestIsMishan and _mishanOverview and !_mishanOverview.defeated>>Dominant Power<<else>>Strongest<</if>></span><strong><<if _strongest>><<print _strongest.name ?? "Unknown">> <<if _strongestIsMishan and _mishanOverview>><em><<print _mishanOverview.militaryLabel>></em><<else>><em>Mil <<print Number(_strongest.stats?.milStr ?? _strongest.milStr ?? 0)>></em><</if>><<else>>None<</if>></strong></div>
</div>
<div class="othertribes-panel">
<div class="othertribes-panel-title">Known Tribes</div>
<div class="othertribes-list tribes-list">
<<if _knownCount > 0>>
<<for _displayIndex = 0; _displayIndex < _displayKnownTribes.length; _displayIndex++>>
<<tribeRow _displayKnownTribes[_displayIndex]>>
<</for>>
<<else>>
<div class="othertribes-empty">
<strong>No tribes known</strong>
<span>Scout the wilds or follow events to learn who shares the land around your camp.</span>
</div>
<</if>>
</div>
</div>
</div><<silently>>
<<set _pid = $personInfoId ?? $selectedPersonId ?? $personSelectedId ?? $activePersonId>>
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !$personInfoTab>><<set $personInfoTab = "friendly">><</if>>
<<if !$npcKnownNames>><<set $npcKnownNames = {}>><</if>>
<<if !$npcRevealedName>><<set $npcRevealedName = {}>><</if>>
<<set _campNpc = (setup.campNpcs and setup.campNpcs.getById) ? setup.campNpcs.getById(_pid) : null>>
<<set _defaultName = (_campNpc ? (_campNpc.name ?? _p?.name ?? "Unknown person") : (_p ? (_p.name ?? "Unknown person") : "Unknown"))>>
<<if (_p and _p._source is "campNpc") or _campNpc>>
<<if _pid is "npc_outcast">><<set _defaultName = "Outcast">><</if>>
<<if _pid is "npc_outcast_brother">><<set _defaultName = "The Brother">><</if>>
<</if>>
<<set _name = ($npcKnownNames[_pid] and $npcRevealedName[_pid]) ? $npcRevealedName[_pid] : _defaultName>>
<<set _desc = (setup.campNpcs and setup.campNpcs.getGeneratedProfileDescription) ? setup.campNpcs.getGeneratedProfileDescription(_campNpc ?? _p ?? _pid) : (_campNpc ? (_campNpc.description ?? _campNpc.desc ?? _p?.description ?? "No description.") : (_p ? (_p.description ?? "No description.") : "No description."))>>
<<set _relationshipProfileText = (setup.relationships and setup.relationships.getProfileText) ? setup.relationships.getProfileText(_campNpc ?? _p ?? _pid) : "">>
<<if _relationshipProfileText>><<set _desc = String(_desc ?? "").replace(/\s+$/g, "") + " " + _relationshipProfileText>><</if>>
<<set _role = (_campNpc ? (_campNpc.role ?? _p?.role ?? "Unknown") : (_p ? (_p.role ?? "Unknown") : "Unknown"))>>
<<set _gender = (_campNpc ? (_campNpc.gender ?? _p?.gender ?? "male") : (_p ? (_p.gender ?? "male") : "male"))>>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<set _mood = (_campNpc and _campNpc.mood and _campNpc.mood.state) ? _campNpc.mood.state : ((_p and _p.mood and _p.mood.state) ? _p.mood.state : "calm")>>
<<set _love = Number(_p ? (_p.love ?? _campNpc?.love ?? 0) : (_campNpc ? (_campNpc.love ?? 0) : 0))>>
<<set _trust = Number(_p ? (_p.trust ?? _campNpc?.trust ?? 0) : (_campNpc ? (_campNpc.trust ?? 0) : 0))>>
<<set _obed = Number(_p ? (_p.obedience ?? _p.influence ?? _campNpc?.obedience ?? _campNpc?.influence ?? 0) : (_campNpc ? (_campNpc.obedience ?? _campNpc.influence ?? 0) : 0))>>
<<if _isFemale>>
<<set _affLabel = "Love">>
<<set _aff = _love>>
<<else>>
<<set _affLabel = "Trust">>
<<set _aff = _trust>>
<</if>>
<<set _relationship = "Neutral">>
<<if _aff >= 80 and _obed >= 80>><<set _relationship = "Devoted">>
<<elseif _aff >= 60 and _obed >= 60>><<set _relationship = "Loyal">>
<<elseif _aff >= 60 and _obed < 30>><<set _relationship = "Affectionate but Defiant">>
<<elseif _aff < 30 and _obed >= 60>><<set _relationship = "Obedient (Cold)">>
<<elseif _aff < 30 and _obed < 30>><<set _relationship = "Hostile">>
<<elseif _aff >= 45>><<set _relationship = "Friendly">>
<<elseif _obed >= 45>><<set _relationship = "Compliant">>
<</if>>
<<set _roleDisplay = String(_role).replace(/_/g, " ")>>
<<set _moodDisplay = String(_mood).replace(/_/g, " ")>>
<<set _isCampNpc = !!(_campNpc or (_p and _p._source is "campNpc"))>>
<<set _isTribeLeaderNpc = !!((_p and (_p.source is "tribeLeaderNpc" or _p._source is "tribeLeader" or _p.role is "Tribe Leader")) or (_campNpc and _campNpc.source is "tribeLeaderNpc"))>>
<<set _isGeneratedNpc = !!(setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(_campNpc ?? _p))>>
<<set _isImportantPerson = !!(setup.people and setup.people.isImportantPerson and setup.people.isImportantPerson(_p ?? _campNpc ?? _pid, _campNpc))>>
<<set _isPrisoner = !!(_p and setup.prisoners and setup.prisoners.isPrisoner and setup.prisoners.isPrisoner(_p))>>
<<set _typeLabel = _isPrisoner ? "Captive" : (_isTribeLeaderNpc ? "Tribe Leader" : (_isGeneratedNpc ? "Camp Follower" : (_isImportantPerson ? "Important Person" : "Person")))>>
<<set _prisonerFormerLabel = _isPrisoner and setup.prisoners and setup.prisoners.getFormerLabel ? setup.prisoners.getFormerLabel(_p) : "">>
<<set _genderDisplay = _isFemale ? "Female" : ((_gender is "male") ? "Male" : "Unknown")>>
<<set _ageLabel = (setup.npcAge and setup.npcAge.getLabel) ? setup.npcAge.getLabel(_campNpc ?? _p) : "Unknown">>
<<set _adultInteractionAllowed = (setup.npcAge and setup.npcAge.canUseSexualInteraction) ? setup.npcAge.canUseSexualInteraction(_campNpc ?? _p) : true>>
<<set _roleLower = String(_roleDisplay).toLowerCase()>>
<<set _moodLower = String(_moodDisplay).toLowerCase()>>
<<set _showRole = !_isGeneratedNpc and !_isTribeLeaderNpc and !_isPrisoner and _roleLower is not "camp npc" and _roleLower is not "unknown" and _roleLower is not "wanderer">>
<<set _showMood = _moodLower is not "none" and _moodLower is not "unknown">>
<<set _raidProfile = (_campNpc and setup.campNpcs and setup.campNpcs.ensureRaidLeaderProfile) ? setup.campNpcs.ensureRaidLeaderProfile(_campNpc) : (_p ? (_p.raidLeader ?? null) : null)>>
<<set _raidStatKeys = (setup.campNpcs and setup.campNpcs.raidStatKeys) ? setup.campNpcs.raidStatKeys : ["wisdom", "strength", "endurance", "leadership", "charisma", "stewardship"]>>
<<set _canGeneral = !!(_raidProfile and _raidProfile.canBeGeneral)>>
<<if setup.campNpcs and setup.campNpcs.isInjured and setup.campNpcs.isInjured(_campNpc ?? _p)>><<set _canGeneral = false>><</if>>
<<set _canRaidPowers = !!(_raidProfile and _raidProfile.allowRaidPowers)>>
<<set _hasCommandProfile = !!_raidProfile>>
<<set _commandStatusLabel = _hasCommandProfile ? (_canGeneral ? "Leader Eligible" : "Leader Locked") : "No Command Profile">>
<<set _injuryTurns = (setup.campNpcs and setup.campNpcs.getInjuryRemaining) ? setup.campNpcs.getInjuryRemaining(_campNpc ?? _p) : 0>>
<<set _personalitySource = _campNpc ? _campNpc : (_p ? _p : {})>>
<<set _personalityProfile = (setup.npcPersonality and setup.npcPersonality.getProfile) ? setup.npcPersonality.getProfile(_personalitySource) : { personality: "Not yet defined", traits: [], traitIds: [], physicalTraitLabel: "Not assigned" }>>
<<set _personalityName = _personalityProfile.personality ?? _personalityProfile.archetype?.name ?? "Not yet defined">>
<<set _traitHtml = (setup.npcPersonality and setup.npcPersonality.renderTraitNameChips) ? setup.npcPersonality.renderTraitNameChips(_personalityProfile.traitIds ?? []) : '<span class="person-sheet-trait-empty">None known</span>'>>
<<set _physicalTraitLabel = _personalityProfile.physicalTraitLabel ?? "Not assigned">>
<<set _physicalTraitHtml = (setup.npcPhysical and setup.npcPhysical.renderTraitLabel) ? setup.npcPhysical.renderTraitLabel(_personalitySource) : _physicalTraitLabel>>
<<if _campNpc and _isGeneratedNpc and setup.npcPhysical and setup.npcPhysical.ensureAppearanceTraits>><<run setup.npcPhysical.ensureAppearanceTraits(_campNpc)>><</if>>
<<set _appearanceSource = _campNpc ? _campNpc : (_p ? _p : {})>>
<<set _appearanceHtml = (setup.npcPhysical and setup.npcPhysical.renderAppearanceTraitChips) ? setup.npcPhysical.renderAppearanceTraitChips(_appearanceSource) : '<span class="person-sheet-trait-empty">None known</span>'>>
<<set _campPositionLabel = (setup.campPositions and setup.campPositions.getNpcPositionLabel) ? setup.campPositions.getNpcPositionLabel(_pid) : "None">>
<<if _isPrisoner>><<set _campPositionLabel = "Prisoner">><</if>>
<<set _specialTraitsHtml = (setup.people and setup.people.renderSpecialTraitsHtml) ? setup.people.renderSpecialTraitsHtml(_p ?? _campNpc ?? _pid) : '<span class="person-sheet-trait-empty">None known</span>'>>
<</silently>>
<div class="person-sheet-shell">
<div class="person-sheet-card">
<div class="person-sheet-head">
<div class="person-sheet-head-main">
<div class="person-sheet-name"><<print String(_name).toUpperCase()>></div>
<div class="person-sheet-headline">
<span class="person-sheet-pill person-sheet-pill--rel"><<print _relationship>></span>
<<if _personalityName and _personalityName !== "Not yet defined">><span class="person-sheet-pill person-sheet-pill--personality"><<print _personalityName>></span><</if>>
<span class="person-sheet-pill"><<print _genderDisplay>></span>
<span class="person-sheet-pill"><<print _ageLabel>></span>
<span class="person-sheet-pill"><<print _typeLabel>></span>
<<if !_isPrisoner>><span class="person-sheet-pill">Position: <<print _campPositionLabel>></span><</if>>
<<if _isPrisoner and _prisonerFormerLabel>><span class="person-sheet-pill"><<print _prisonerFormerLabel>></span><</if>>
<<if _injuryTurns > 0>><span class="person-sheet-pill person-sheet-pill--injured">Injured: <<print _injuryTurns>> turn<<if _injuryTurns isnot 1>>s<</if>></span><</if>>
<<if _showRole>><span class="person-sheet-pill"><<print _roleDisplay>></span><</if>>
<<if _moodLower !== "none" and _moodLower !== "unknown" and _moodLower !== "calm">><span class="person-sheet-pill"><<print _moodDisplay>></span><</if>>
<span class="person-sheet-pill"><<print _commandStatusLabel>></span>
<<if _hasCommandProfile and _canRaidPowers>><span class="person-sheet-pill">Power Access</span><</if>>
</div>
</div>
<div class="person-sheet-head-actions">
<<if _isCampNpc>><<link "Assignment">><<set $activePersonId = _pid>><<set $personInfoId = _pid>><<set $campPositionAssignmentReturn = "Person_Info">><<goto "Camp_Position_Assignment">><</link>><</if>>
<<link "Return">><<set _returnPassage = $personInfoReturnPassage ?? "Interact">><<set $personInfoReturnPassage = null>><<goto _returnPassage>><</link>>
</div>
</div>
<div class="person-sheet-body">
<div class="person-sheet-portrait-col">
<div class="person-sheet-portrait-frame">
<div class="tribeinfo-img person-sheet-portrait">IMG</div>
</div>
</div>
<div class="person-sheet-main">
<div class="person-sheet-top-grid">
<div class="person-sheet-desc-card">
<div class="person-sheet-section-label">Profile</div>
<div class="person-sheet-desc-text"><<print _desc>></div>
</div>
<<if _isImportantPerson>>
<div class="person-sheet-important-traits">
<div class="person-sheet-personality-card person-sheet-special-traits-card">
<div class="person-sheet-section-label">Special Traits</div>
<div class="person-sheet-trait-row"><<print _specialTraitsHtml>></div>
</div>
</div>
<<else>>
<div class="person-sheet-traits-grid">
<div class="person-sheet-personality-card person-sheet-physical-card">
<div class="person-sheet-section-label">Physical Traits</div>
<div class="person-sheet-appearance-list"><<print _appearanceHtml>></div>
</div>
<div class="person-sheet-personality-card person-sheet-personality-traits-card">
<div class="person-sheet-section-label">Personality Traits</div>
<div class="person-sheet-trait-row"><<print _traitHtml>></div>
</div>
</div>
<</if>>
</div>
<div class="person-sheet-detail-grid">
<div class="person-sheet-bond-strip">
<div class="person-sheet-section-label">Bond</div>
<div class="person-sheet-bond-inline">
<div class="person-sheet-bond-name"><<print _relationship>></div>
<div class="person-sheet-meter-row">
<span><<print _affLabel>></span>
<strong><<print _aff>></strong>
</div>
<div class="person-sheet-meter-row">
<span>Obedience</span>
<strong><<print _obed>></strong>
</div>
</div>
</div>
<div class="person-sheet-mechanics-card">
<div class="person-sheet-section-label">Stats</div>
<div class="person-sheet-statgrid person-sheet-statgrid--npc">
<<for _si = 0; _si < _raidStatKeys.length; _si++>>
<<set _statKey = _raidStatKeys[_si]>>
<<set _statLabel = _statKey.charAt(0).toUpperCase() + _statKey.slice(1)>>
<<set _statValue = _campNpc
? setup.campNpcs.getRaidStat(_campNpc, _statKey)
: (_raidProfile
? Number((_raidProfile.statsBase and _raidProfile.statsBase[_statKey]) ?? 0) + Number((_raidProfile.statMods and _raidProfile.statMods[_statKey]) ?? 0)
: Number(_p ? (_p[_statKey] ?? 0) : 0))>>
<<if !_campNpc and setup.npcAge and setup.npcAge.getEffectiveStat>><<set _statValue = setup.npcAge.getEffectiveStat(_personalitySource, _statKey, _statValue)>><</if>>
<<if !_campNpc and setup.npcPhysical and setup.npcPhysical.getEffectiveStat>><<set _statValue = setup.npcPhysical.getEffectiveStat(_personalitySource, _statKey, _statValue)>><</if>>
<<if !_campNpc and setup.npcPersonality and setup.npcPersonality.getEffectiveStat>><<set _statValue = setup.npcPersonality.getEffectiveStat(_personalitySource, _statKey, _statValue)>><</if>>
<div class="person-sheet-statbox">
<span class="k"><<print _statLabel>></span>
<span class="v"><<print _statValue>></span>
</div>
<</for>>
</div>
</div>
</div>
</div>
</div>
<<if _isCampNpc or _isTribeLeaderNpc or _isPrisoner>>
<<else>>
<div class="person-sheet-footer">
<div class="person-sheet-tabs">
<<if $personInfoTab is "friendly">>
<span class="person-sheet-tab is-active">Friendly</span>
<<link "Hostile">><<set $personInfoTab = "hostile">><<goto "Person_Info">><</link>>
<<else>>
<<link "Friendly">><<set $personInfoTab = "friendly">><<goto "Person_Info">><</link>>
<span class="person-sheet-tab is-active">Hostile</span>
<</if>>
</div>
<div class="person-sheet-action-row">
<<if $personInfoTab is "friendly">>
<<link "Talk">>
<<set $npcTalkOutput = "">>
<<run if (!State.variables.npcTalkMenu) { State.variables.npcTalkMenu = {}; } if (_pid) { delete State.variables.npcTalkMenu[_pid]; }>>
<<goto "Talk_1">>
<</link>>
<<if _isFemale>>
<<npcOncePerTurn _pid "sex">>
<<if !_adultInteractionAllowed>>
<span class="macro-button disabled person-sheet-disabled" title="Unavailable for this age group.">Sex</span>
<<elseif _canUse>>
<span class="macro-button disabled is-wip person-sheet-disabled" title="Under construction">Sex</span>
<<else>>
<span class="macro-button disabled person-sheet-disabled" title="Already used this turn.">Sex</span>
<</if>>
<</if>>
<<else>>
<<link "Kill">><<goto "Person_Kill">><</link>>
<</if>>
</div>
</div>
<</if>>
</div>
</div><<silently>>
/* resolve active person id */
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
/* find person */
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<set _ageAdultAllowed = (setup.npcAge and setup.npcAge.canUseSexualInteraction) ? setup.npcAge.canUseSexualInteraction(_p) : true>>
<<if $sexGateOutput is null>><<set $sexGateOutput = "">><</if>>
<<if $sexGatePassed is null>><<set $sexGatePassed = false>><</if>>
/* age is the first hard gate for any adult interaction */
<<if !_ageAdultAllowed>>
<<set $sexGateOutput = "<div class='npc-check npc-check-bad'><b>Unavailable.</b> This option is not available for this character.</div>">>
<<elseif !_isFemale>>
<<set $sexGateOutput = "<div class='npc-check npc-check-bad'><b>Unavailable.</b> This option is not available for this character.</div>">>
<</if>>
<</silently>>
<div class="hub-textbox">
<<if _p>>
You consider stepping closer to <<print _p.name ?? "her">>.
<<else>>
You hesitate—there’s no one selected.
<</if>>
<<if $sexGateOutput>>
<hr>
<<print $sexGateOutput>>
<</if>>
</div>
<div class="hub-buttons">
<<if _ageAdultAllowed and _isFemale and !$sexGateOutput>>
<<button "Proceed">>
<<silently>>
/* consume once-per-turn usage right when you attempt */
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_pid]>><<set $npcOncePerTurn[_pid] = {}>><</if>>
<<set $npcOncePerTurn[_pid]["sex"] = _turnNow>>
<</silently>>
<!-- AUTO at 80; otherwise CHA check -->
<<npcCheck _pid "charisma" 18 "silent" 80>>
<<silently>>
<<if $npcLastCheck.ok>>
<<set $sexGatePassed = true>>
<<set _flavor = "She reads your intent without flinching. After a beat, she gives a small nod—permission, on her terms.">>
<<set _line = ($npcLastCheck.auto)
? "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div>"
: "<div class='npc-check npc-check-ok'>Check: (Charisma " + $npcLastCheck.stat + " + d20 " + $npcLastCheck.roll + ") = " + $npcLastCheck.total + " vs DC " + $npcLastCheck.dc + ". <b>Success!</b></div>">>
<<else>>
<<set $sexGatePassed = false>>
<<set _flavor = "She doesn’t reject you outright—but her eyes warn you off. Not now. Not like this.">>
<<set _line = "<div class='npc-check npc-check-bad'>Check: (Charisma " + $npcLastCheck.stat + " + d20 " + $npcLastCheck.roll + ") = " + $npcLastCheck.total + " vs DC " + $npcLastCheck.dc + ". <b>Fail!</b></div>">>
/* small penalty on fail (Love for female) */
<<if _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 1>>
<</if>>
<</if>>
<<set $sexGateOutput = _line + "<div class='npc-answer' style='margin-top:.5rem;'>" + _flavor + "</div>">>
<</silently>>
<<goto "Person_Sex">>
<</button>>
<</if>>
<<if $sexGatePassed>>
<<button "Continue">>
<<set $sexGateOutput = "">>
<<set $sexGatePassed = false>>
<<goto "Sexual_Intercourse">>
<</button>>
<</if>>
<<button "Return">>
<<set $sexGateOutput = "">>
<<set $sexGatePassed = false>>
<<goto "Person_Info">>
<</button>>
</div><<silently>>
<<if setup.prisoners and setup.prisoners.ensureState>><<run setup.prisoners.ensureState()>><</if>>
<<set _pid = $activePersonId ?? $personInfoId ?? $selectedPersonId ?? $personSelectedId>>
<<set _terminal = ($prisonerTerminalResult and $prisonerTerminalResult.npcId and String($prisonerTerminalResult.npcId) is String(_pid ?? "")) ? $prisonerTerminalResult : null>>
<<if !_pid or (!(setup.prisoners and setup.prisoners.getById and setup.prisoners.getById(_pid)) and !_terminal)>><<set $interactPeopleTab = "prisoners">><<goto "Interact">><</if>>
<<if !$prisonerInteractTab>><<set $prisonerInteractTab = "convert">><</if>>
<<if ["convert", "powers", "judgment"].indexOf($prisonerInteractTab) < 0>><<set $prisonerInteractTab = "convert">><</if>>
<</silently>>
<<print setup.prisoners.renderInteractPassage(_pid)>><<silently>>
<<set $q_outcast_brother_01_choice = null>>
/* Spend energy */
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* Pull current tile from map */
<<set _expLoc = setup.quests && setup.quests.getExpeditionLocation ? setup.quests.getExpeditionLocation("q_outcast_brother_01") : { x:$campX, y:$campY }>>
<<set _key = String(_expLoc.x) + "," + String(_expLoc.y)>>
<<set _tile = (setup.map && setup.map.tiles) ? setup.map.tiles[_key] : null>>
<<set _terrain = String(_tile && _tile.terrain ? _tile.terrain : "land")>>
/* Power option */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 10) : 10)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<</silently>>
<<run setup.playBattle()>>
''<div class="hub-textbox">
<p>You begin the search with the Outcast beside you.</p>
<p>There is urgency in it, but not panic. Running blindly would only waste the little time her brother may have left.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“We split around here. Sha-na... that fool. He shoved me into a hollow and told me to stay quiet. Then he ran off making enough noise to wake the dead.”</span></div>
<p>Her voice roughens as the memory catches up with her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“The wound was nothing. I could have fought.”</span></div>
<p>She bites her lip hard enough to draw blood, refusing to give the pain anything else.</p>
<p>You do not argue. When you found her, she could barely stand.</p>
<p>Instead, you study the ground.</p>
<p>A broken stem. Soil kicked loose in the wrong direction. A stride that lengthens, then shortens as exhaustion takes hold. One wounded man deliberately leaving a trail. Several others following without haste because they believe the ending is already decided.</p>
<p>The Outcast watches as you piece it together. She stops trying to direct you and lets you work.</p>
<<if _terrain is "mountains">>
<p>The trail climbs.</p>
<p>Soft earth gives way to stone, and the trees thin until there is little left but fractured rock, scrub, and wind. Footprints do not last here, but the mountain keeps other records: a fresh slide of scree, a pale scrape where a weapon struck granite, a dark smear of blood across stone.</p>
<p>The Outcast notices where your attention settles.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Those bastards always climb. Stone makes wounded legs slow.”</span></div>
<p>The wind carries voices from somewhere ahead, broken into fragments by the ridge.</p>
<p>You crest it carefully and find the hunt nearly finished.</p>
<p>Five men have Tiksi cornered on a narrow shelf of rock. Two stand close with spears leveled. The others hold back, blocking the remaining routes and watching with the patience of men who expect no surprise.</p>
<p>Tiksi is pressed against the rock face. One arm hangs uselessly at his side, and blood has made the stone beneath him slick. He is barely upright, but the knife in his good hand has not fallen.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“No more climbing, Tiksi.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“You were always better at running than fighting. Would've made a poor chieftain.”</span></div>
<p>Their leader does not laugh.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Drop the blade.”</span></div>
<p>Tiksi bares his teeth.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tiksi</span><span class="dialogue-line">“Come take it.”</span></div>
<p>The Outcast goes rigid beside you. Before you can stop her, she draws breath and shouts across the ridge.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“YOU TREACHEROUS SNAKES!”</span></div>
<<elseif _terrain is "forest">>
<p>The trail pulls deeper into dense forest. Light thins beneath the canopy, and the undergrowth shows exactly where a wounded man stopped caring about concealment.</p>
<p>The signs grow worse as you follow them. Turns too sharp. Steps too close together. A stumble here, a broken branch there. Control is bleeding out of his trail as surely as blood.</p>
<p>The Outcast crouches beside a snapped branch without touching it.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“They're herding him. Five dogs to tree one cat, and they called him the coward.”</span></div>
<p>You hear the hunters before you see them: low voices and the easy laughter of men with time to spare.</p>
<p>Beyond the last screen of brush, five men have Tiksi boxed against a broad oak. Two hold the front while the others cover the gaps between the trees.</p>
<p>Blood runs down his side and darkens the roots beneath him. His hand trembles around a blade, but he still has it.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Still on your feet?”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“Gave you more credit than you deserved, Tiksi. Almost.”</span></div>
<p>Tiksi answers through clenched teeth.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tiksi</span><span class="dialogue-line">“I'll take one of you with me.”</span></div>
<p>The men laugh.</p>
<p>The Outcast does not.</p>
<p>She drags in a breath and screams through the trees.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“YOU DOGS! GET AWAY FROM HIM!”</span></div>
<<else>>
<p>The trail leads into open country where there is nowhere for a wounded man to disappear. Scrub and stone stretch beneath a pale sky, and every track lies exposed to anyone patient enough to follow.</p>
<p>The Outcast looks across the ground ahead.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Too open. They'll run him down like a rabbit.”</span></div>
<p>She tries to make it sound like an observation. The fear beneath it is harder to hide.</p>
<p>The tracks converge several times before you reach the people who made them. By then the ring has already closed.</p>
<p>Five hunters stand around Tiksi in the open. Their spears are held loosely because they no longer expect a fight worth respecting. Tiksi is down on one knee, blood darkening the dirt beneath him, but his eyes remain fixed on the man in front of him.</p>
<p>The leader gestures with his spear.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Should've stayed and died to the chieftain like a man. Now nobody will even see it. A dog's death, Tiksi.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“A lesson for weak blood.”</span></div>
<p>The Outcast's hands curl into fists.</p>
<p>Then restraint breaks.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“ADOHI! YOU TRAITOROUS WORM! DON'T YOU FEEL SHAME? GET AWAY FROM HIM!”</span></div>
<</if>>
<p>The shout freezes the scene.</p>
<p>Tiksi lifts his head with visible effort and looks past the men around him. Confusion crosses his face before he finds his sister beside you.</p>
<p>The anger in him disappears.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tiksi</span><span class="dialogue-line">“Sister...”</span></div>
<p>The hunters turn as one.</p>
<p>Their attention finds you first, then her. Recognition spreads across their faces. Whatever easy certainty they had a moment ago is replaced by the irritation of a problem they thought was already solved.</p>
<p>Adohi lets out a short laugh.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Shaman girl lives. Thought the forest had her by now.”</span></div>
<p>His eyes shift to you and begin taking stock: weapon, stance, size, distance.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“And she brings help.”</span></div>
<<cgimg "images/expeditions/BrotherQuest/brother1.png" alt="Amogus">>
<<if $height < 160>>
<p>Adohi looks you over once and dismisses you almost immediately.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Small.”</span></div>
<p>A grin spreads through the others, followed by laughter.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Always knew she was too arrogant for a woman after what she did to the chief. Didn't think she'd be stupid enough to challenge five men with half a man as backup.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“Maybe she thinks we'll trip over the little one while she drags Tiksi away.”</span></div>
<p>The Outcast stiffens behind you. She says nothing, but the laughter hits exactly where they intend it to.</p>
<<elseif $height >= 190 and $height < 210>>
<p>Adohi's smile fades as he is forced to look upward to meet your eyes.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Big one. Strong, too. Hunter?”</span></div>
<p>The laughter behind him dies. His men spread out and lower their spears into a more deliberate guard. They do not look frightened, but they have stopped treating you as a joke.</p>
<<elseif $height >= 210>>
<p>Adohi's expression changes before he can hide it.</p>
<p>He has to tilt his head back to meet your eyes. A low murmur moves through the others, not laughter this time but unease.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“That's... not right.”</span></div>
<p>The loose ring around Tiksi widens. Spears rise higher. Whatever mockery they had prepared is gone beneath the more immediate problem of something standing in front of them that does not fit their sense of how large a man should be.</p>
<<else>>
<p>They measure you in silence before Adohi's contempt returns.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“What makes a man throw his life away for nothing? Did she offer you her cunt?”</span></div>
<p>A few of the hunters snicker.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Always wondered what she was like myself.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“Wouldn't die for it.”</span></div>
<p>The Outcast goes very still behind you.</p>
<</if>>
<p>Whatever their first reaction, the clearing changes once they realize you are not leaving.</p>
<p>A foot shifts. Spear grips tighten. Their attention moves away from Tiksi and settles on you.</p>
<p>The Outcast takes half a step toward her brother before forcing herself to stop. Every part of her wants to move. She does not.</p>
<p>Instead, she looks at you.</p>
<p>She brought you here because she believed you could change what happens next.</p>
<p>Now she waits for you to prove it.</p>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Break their line with brute force. (Strength)</span>">>
<<set $q_outcast_brother_01_choice = "str">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<if $height < 160>>
<span class="macro-button disabled" title="Too short!">
<span class="choice-text">Make them a promise of violence, spoken with absolute certainty. (Charisma/Intimidation)</span>
</span>
<<else>>
<<button "<span class='choice-text'>Make them a promise of violence, spoken with absolute certainty. (Charisma/Intimidation)</span>">>
<<set $q_outcast_brother_01_choice = "cha">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<</if>>
<<button "<span class='choice-text'>Use your eyes, not your hands. Find the weakness in their approach. (Wisdom)</span>">>
<<set $q_outcast_brother_01_choice = "wis">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<if _canSpark>>
<<button "<span class='choice-text'>Remind them what happens when you poke fire (Use Spark) (Spark: <<print _sparkCost>> Belief) — Auto success</span>">>
<<set $q_outcast_brother_01_choice = "spark">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="<<print _hasSpark ? ('Need ' + _sparkCost + ' Belief.') : 'You have not acquired Spark.'>>">
<span class="choice-text">Remind them what happens when you poke fire (Use Spark) (Spark: <<print _sparkCost>> Belief) — Auto success</span>
</span>
<</if>>
</div><<silently>><<set _qid = "q_outcast_brother_01">>
<<set _choice = $q_outcast_brother_01_second_choice ?? "watch">>
<<set _mend = setup.powerById("mend_wounds")>>
<<set _mendCost = Number(_mend ? (_mend.cost ?? 25) : 25)>>
<<set _hasMend = !!($powersOwned && $powersOwned.mend_wounds)>>
<<set _canMend = _hasMend and Number($belief ?? 0) >= _mendCost>>
<<set _choice = (_choice is "mend_wounds" and _canMend) ? "mend_wounds" : "watch">>
<<set _ok = _choice is "mend_wounds">>
<<if _ok>>
<<set $belief = Number($belief ?? 0) - _mendCost>>
<</if>>
<<set $questLastCheck = {
ok:_ok,
statKey: (_choice is "mend_wounds") ? "mend_wounds" : "none",
stat:0,
roll:0,
dc:0,
total:0,
choice:_choice
}>>
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and ($quests[_i].id is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set $q_outcast_brother_01_resolvedTurn = $turn>>
<<set $q_outcast_brother_01_resolvedStatus = _ok ? "complete" : "failed">>
<<set _newStatus = _ok ? "complete" : "failed">>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = _newStatus>>
<<set $quests[_qIndex].markerRevealed = false>>
<<run setup.outcastBrotherQuest.finalizeResolvedQuest($quests[_qIndex])>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if _ok>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task</span>
<span class="value">Failed</span>
</div>
<</if>>
<<if _choice is "mend_wounds" and _ok>>
<div class="result-line bad">
<span class="label">Belief spent</span>
<span class="value">-<<print _mendCost>></span>
</div>
<div class="result-line">
<span class="label">Aspect</span>
<span class="value"><span style="color:#2f7d32;">+5 Life</span>, <span style="color:#b3261e;">-3 Blood</span></span>
</div>
<</if>>
</div>
<<if _ok>>
<p>You drop beside Tiksi before the last of his strength can leave him.</p>
<p>Your hand presses over the wound.</p>
<p>Heat gathers beneath your palm, followed by a faint light. The power is still crude, nothing like the effortless miracle the act might one day become, but crude does not mean useless.</p>
<p>Tiksi convulses beneath your hand.</p>
<p>Blood spills between your fingers, then begins to slow. Torn flesh shudders and pulls together in uneven increments, resisting you for several long seconds before your will finally forces the wound to close enough.</p>
<p>His eyes snap back into focus.</p>
<p>He drags in a breath.</p>
<p>It is weak and painful, but it is a breath.</p>
<p>The Outcast drops beside him so quickly that she nearly falls. Her hands hover over her brother without touching, uncertain where she can place them without somehow breaking what you just repaired.</p>
<p>For several moments nobody moves.</p>
<p>Tiksi remains pale and shaking against the trunk, but he keeps breathing.</p>
<p>You take both of them back to camp once he can be moved.</p>
<p>Along the way, you hear the Outcast whisper behind you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Thank you.”</span></div>
<p>She says it so quietly that it was probably not meant for you to hear.</p>
<<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["q_outcast_brother_01_done"] = true>>
<<set $questFlags["q_outcast_brother_01"] = true>>
<<if $trackedQuestId is "q_outcast_brother_01">>
<<set $trackedQuestId = null>>
<</if>>
<<run setup.campNpcs.addOutcastBrother()>>
<<run setup.people.syncCampNpcsToPeople()>>
<<run (function () {
const out = setup.people.upsert("npc_outcast", {});
out.love = Number(out.love ?? 0) + 50;
out.obedience = Number(out.obedience ?? 0) + 30;
const bro = setup.people.upsert("npc_outcast_brother", {});
bro.trust = Number(bro.trust ?? 0) + 30;
bro.obedience = Number(bro.obedience ?? 0) + 30;
})();>>
/* Healing with Mend Wounds is a Life act paid for in Blood */
<<run setup.aspects.addPoints("hearth", 5, "Healed the brother with Mend Wounds")>>
<<run setup.aspects.addPoints("blood", -3, "Healed the brother with Mend Wounds")>>
<</silently>>
<<else>>
<p>You kneel beside Tiksi because there is nothing left to do for him.</p>
<p>His breathing comes wet and shallow, each breath smaller than the one before it.</p>
<p>The Outcast sinks to the ground at his side and takes his hand between both of hers. She holds it tightly, as though refusing to loosen her grip might keep him from going anywhere.</p>
<p>Tiksi's eyes find her.</p>
<p>For a moment, some of the pain leaves his face.</p>
<p>His lips move. Whatever he tries to say never becomes more than breath and blood.</p>
<p>She bows over his hand anyway and presses his knuckles against her mouth, listening as though the silence might still contain the words he meant to give her.</p>
<p>His last breath leaves quietly.</p>
<p>Afterward there is only the forest and the sound of his sister trying not to sob.</p>
<p>There is nothing else you can do but remain there while Tiksi dies at the foot of the tree.</p>
<<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["q_outcast_brother_01_done"] = true>>
<<set $questFlags["q_outcast_brother_01"] = true>>
<<if $trackedQuestId is "q_outcast_brother_01">>
<<set $trackedQuestId = null>>
<</if>>
<</silently>>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>">>
<<run setup.stopBattle ? setup.stopBattle() : SimpleAudio.select("Battle").stop()>>
<<goto "Hub_1">>
<</link>>
</div><<silently>><<set _qid = "q_outcast_brother_01">>
/* Choice FIRST (you were using it before it existed) */
<<set _choice = $q_outcast_brother_01_choice ?? "wis">>
/* Base DC by approach */
<<set _baseDC = 14>>
<<if _choice is "str">><<set _baseDC = 13>>
/* NEW: if short (<=160), brute force lands faster — make STR check easier by 2 */
<<if Number($height ?? 0) <= 160>><<set _baseDC = _baseDC - 2>><</if>>
<<elseif _choice is "wis">><<set _baseDC = 13>><</if>>
/* Spark */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _mend = setup.powerById("mend_wounds")>>
<<set _mendCost = Number(_mend ? (_mend.cost ?? 25) : 25)>>
<<set _hasMend = !!($powersOwned && $powersOwned.mend_wounds)>>
<<set _canMend = _hasMend and Number($belief ?? 0) >= _mendCost>>
/* Pick stat key */
<<set _statKey = (_choice is "str") ? "strength" : ((_choice is "cha") ? "charisma" : "wisdom")>>
/* Roll */
<<set _roll = random(1, 20)>>
<<set _stat = setup.player.getStatForCheck(_statKey)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
/* Spark: if owned + can pay, auto-success */
<<if _choice is "spark">>
<<if _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<set _ok = true>>
<<set _roll = 20>>
<<set _statKey = "spark">>
<<set _stat = 0>>
<<set _total = 20>>
<<else>>
/* fail-safe: fall back to wisdom if routed here incorrectly */
<<set _choice = "wis">>
<<set _statKey = "wisdom">>
<<set _roll = random(1,20)>>
<<set _stat = setup.player.getStatForCheck("wisdom")>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
<</if>>
<</if>>
<<set $questLastCheck = {
ok:_ok,
statKey:_statKey,
stat:_stat,
roll:_roll,
dc:_baseDC,
total:_total,
choice:_choice
}>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and ($quests[_i].id is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if $questLastCheck.ok>>
<<set $q_outcast_brother_01_resolvedTurn = $turn>>
<<set $q_outcast_brother_01_resolvedStatus = "complete">>
<<else>>
<<set $q_outcast_brother_01_resolvedTurn = null>>
<<set $q_outcast_brother_01_resolvedStatus = null>>
<</if>>
/* update quest status */
<<set _newStatus = $questLastCheck.ok ? "complete" : "active">>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = _newStatus>>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>><</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $questLastCheck.statKey>> + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<<if $questLastCheck.choice is "spark">>
<div class="result-line bad">
<span class="label">Belief spent</span>
<span class="value">-<<print _sparkCost>></span>
</div>
<</if>>
</div>
<<if $questLastCheck.ok>>
<p>Your choice breaks the certainty holding their line together.</p>
<<if $questLastCheck.choice is "str">>
<<if Number($height ?? 0) <= 160>>
<p>Their laughter is still dying when you move.</p>
<p>The distance between you disappears so quickly that the nearest hunter has time for only half a word.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Wha-”</span></div>
<p>Your hand catches his beard and jerks him forward into your rising fist. Bone gives with a wet crack. By the time his body hits the ground, the others are no longer laughing.</p>
<p>Adohi stares at you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Adohi</span><span class="dialogue-line">“Fast.”</span></div>
<p>One of the men stumbles backward in sudden panic. Even the Outcast looks shocked for a moment before the expression gives way to something much closer to hope.</p>
<<else>>
<p>You do not negotiate.</p>
<p>You drive straight into the center of them before their spears can become useful. At close range the weapons are too long and the men are too crowded together to use them cleanly without threatening one another.</p>
<p>Your shoulder hits the first hunter hard enough to fold him around the impact. Ribs give beneath you. Before he can fall, your forearm catches another under the chin and snaps his head back.</p>
<p>The ring breaks under the force of your charge.</p>
<p>One spear scrapes across your ribs as its owner retreats.</p>
<<if setup.player.getStatForCheck("endurance") >= 5>>
<p>The point fails to break your skin. You barely feel more than the shove behind it.</p>
<<else>>
<p>It cuts a hot line across your side, painful but shallow compared with the damage you are dealing in return.</p>
<</if>>
<p>The hunters were prepared to chase down a wounded man. They were not prepared for something that could simply drive through their formation.</p>
<</if>>
<<elseif $questLastCheck.choice is "cha">>
<p>You speak without raising your voice.</p>
<p>There is no plea in it and no attempt to bargain. You sound like someone stating an outcome that has already been decided.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">$user</span><span class="dialogue-line">“You can walk away. Right now.”</span></div>
<p>One hunter starts to laugh, then stops when nobody joins him.</p>
<p>You point toward Tiksi.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">$user</span><span class="dialogue-line">“That one is not worth dying for.”</span></div>
<p>The words force them to consider a possibility they had ignored until now: that killing Tiksi may cost more than letting him go.</p>
<p>Their formation loosens. Eyes move toward Adohi, then toward the trees behind them. Nobody wants to be the first to retreat, but nobody is eager to discover whether you mean exactly what you said.</p>
<<elseif $questLastCheck.choice is "wis">>
<p>You do not rush them.</p>
<p>You watch.</p>
<p>The two men in front lean forward with the impatience of people expecting an easy finish. The three behind them are looser, resting their spears in comfortable positions because numbers have made them careless.</p>
<p>The weakness is not one man. It is the space between them.</p>
<p>Adohi glances toward the Outcast. The hunter beside him follows the movement, his spear dipping slightly with his attention.</p>
<p>That is enough.</p>
<p>You step through the gap before they understand what opened it.</p>
<p>Your hand strikes the first hunter at the side of the neck. He drops before he can make a sound.</p>
<p>You turn into the next man and sweep his knee sideways. The joint folds with a wet pop. He hits the ground, shocked into silence for a heartbeat before the pain catches up and tears a scream from him.</p>
<p>Adohi is already backing away.</p>
<p>His contempt is gone. His spear is held properly now, point fixed on you with both hands while he finally understands that the advantage of five men only matters if those five can act together.</p>
<<else>>
<p>You open your hand.</p>
<p>A small pale flame gathers above your palm.</p>
<p>It is enough to silence them.</p>
<p>The men stare at the light with the instinctive dread of people watching something happen that should not be possible. Dry heat rolls across the clearing. Hands shift uneasily on wooden spear shafts.</p>
<p>The Outcast goes still behind you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“What are you...?”</span></div>
<<cgimg "images/expeditions/BrotherQuest/brother2.png" alt="Amogus">>
<p>Before she can finish, the flame divides.</p>
<p>The first embers strike the hunters nearest you and cling where they land. Pale fire races across clothing and skin. Screams replace the silence almost immediately.</p>
<p>Another hunter tries to run. A third ember catches him before he clears the line.</p>
<p>By the time the impossible fire fades, most of the hunting party is down and Adohi is left staring at what remains of his men.</p>
<p>For the first time since you arrived, he looks genuinely terrified.</p>
<</if>>
<p>Tiksi uses the opening.</p>
<p>He pushes away from his support and makes one last desperate lunge, blade flashing close enough to force the nearest surviving hunter backward. It is not an attempt to win. He only needs enough space to stop being surrounded.</p>
<p>You take the rest from them.</p>
<p>The surviving hunters retreat into a rough half-circle, their spears now held as barriers rather than weapons. Their eyes move between you and Tiksi, recalculating everything they thought they knew about the situation.</p>
<p>You step forward once.</p>
<p>That is enough.</p>
<p>Tiksi sags against you, his full weight settling into your support. His breathing is ragged, but he is alive.</p>
<p>Behind you, the Outcast releases a small, shuddering breath. It is not quite a sob. More the sound of someone who has been holding herself rigid for too long finally allowing one part of her to loosen.</p>
<p>Adohi backs away first. He tries to hide the fear in it, but his hand trembles around the spear.</p>
<<if $questLastCheck.choice is "spark">>
<p>The remaining hunters do not bother with formation. They scatter into the trees, desperate to put distance between themselves and the thing that burned their companions alive.</p>
<<else>>
<p>The remaining hunters follow Adohi in a careful withdrawal, keeping their spears pointed toward you until the forest finally hides them.</p>
<p>You doubt this is the last time their people will remember what happened here.</p>
<</if>>
<<silently>>
/* ===========================
QUEST WRAP-UP + NPC ADD (NORMAL BEHAVIOR) =========================== */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Mark quest resolved */
<<set $questFlags["q_outcast_brother_01_done"] = true>>
<<set $questFlags["q_outcast_brother_01"] = true>>
/* Stop tracking this quest if it was tracked */
<<if $trackedQuestId is "q_outcast_brother_01">>
<<set $trackedQuestId = null>>
<</if>>
/* Add Brother via your helper (adds to $campNpcs) */
<<run setup.campNpcs.addOutcastBrother()>>
/* Force immediate mirror so Interact/Person_Info sees him now */
<<run setup.people.syncCampNpcsToPeople()>>
/* Apply rewards to canonical $people entries (no fragile loops) */
<<run (function () {
const out = setup.people.upsert("npc_outcast", {});
out.love = Number(out.love ?? 0) + 50;
out.obedience = Number(out.obedience ?? 0) + 30;
const bro = setup.people.upsert("npc_outcast_brother", {});
bro.trust = Number(bro.trust ?? 0) + 30;
bro.obedience = Number(bro.obedience ?? 0) + 30;
})();>>
/* IMPORTANT: Do NOT set $activePersonId/$personInfoId here.
That was causing other passages to "stick" to the brother. */
<</silently>>
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
<p>You commit to the approach you chose.</p>
<p>For a moment it looks as though it might work.</p>
<p>Then one mistake gives five experienced hunters exactly the opening they need.</p>
<p>A spear shaft slams into your chest and steals the ground beneath your next step. Another weapon cuts across the gap you meant to use, forcing Tiksi backward before he can exploit your movement.</p>
<p>The men do not need courage. They have routine, numbers, and a wounded target they have already spent too long cornering to let escape now.</p>
<p>Tiksi looks toward you.</p>
<p>Hope flashes across his face for a moment.</p>
<p>Then a spear enters his chest.</p>
<p>The thrust is controlled and practiced. His body jerks, and one hand closes over the wound as if pressure alone might undo it.</p>
<p>The light in his eyes remains, but only barely.</p>
<p>Something in you breaks loose.</p>
<p>The spear in front of you becomes only wood. You snap it. The man holding it becomes only flesh. You put him down, then another. Whatever plan you entered the fight with is gone beneath a sudden, violent refusal to let the hunters continue.</p>
<p>When it ends, the survivors are already fleeing through the trees.</p>
<p>You remain standing among the blood and broken weapons.</p>
<p>Tiksi does not.</p>
<p>He is slumped where he fell, breaths wet and shallow, each one weaker than the last.</p>
<p>The Outcast does not scream. She simply becomes very still, staring at her brother as if the rest of the clearing has ceased to exist.</p>
<p>The hunters are gone.</p>
<p>You are still here.</p>
<p>And Tiksi is dying.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<if $questLastCheck.ok>>
<<link "<span class='choice-text'>Return to camp</span>">>
<<run setup.stopBattle ? setup.stopBattle() : SimpleAudio.select("Battle").stop()>>
<<goto "Hub_1">>
<</link>>
<<else>>
<<if _canMend>>
<<button "<span class='choice-text'>Try to save him with Mend Wounds (Mend Wounds: <<print _mendCost>> Belief)</span>">>
<<set $q_outcast_brother_01_second_choice = "mend_wounds">>
<<goto "Quest1_BrotherSave_FinalResolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="<<print _hasMend ? ('Need ' + _mendCost + ' Belief.') : 'You have not acquired Mend Wounds.'>>">
<span class="choice-text">Try to save him with Mend Wounds (Mend Wounds: <<print _mendCost>> Belief)</span>
</span>
<</if>>
<<button "<span class='choice-text'>Watch His Last Moments</span>">>
<<set $q_outcast_brother_01_second_choice = "watch">>
<<goto "Quest1_BrotherSave_FinalResolve">>
<</button>>
<</if>>
</div><<silently>>
<<set _result = setup.brokenChain.finalizeBattle()>>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : (setup.stopBattle ? setup.stopBattle() : null)>>
<</silently>>
''<div class="hub-textbox">
<h2>Broken Chain</h2>
<<if not _result.ok>>
<p><<print _result.reason>></p>
<<elseif _result.victory>>
The last organized resistance breaks.
One guard throws down his weapon and runs.
Another follows.
The rest are dead, wounded, or no longer capable of keeping the caravan moving.
Your people begin gathering themselves.
Some lean against spears.
Others check wounds.
You look toward the prisoners.
All four remain nearby.
Still bound.
Still watching.
The people taking them to market no longer have any say in what happens next.
Now the choice belongs to you.
<div class="result-list">
<div class="result-line good"><span class="label">Outcome</span><span class="value">Victory</span></div>
<div class="result-line bad"><span class="label">Your losses</span><span class="value"><<print _result.playerLoss>> Population</span></div>
<div class="result-line"><span class="label">Slaver losses</span><span class="value"><<print _result.enemyLoss>></span></div>
</div>
<<else>>
The fight turns against you.
Your people give ground.
Then more.
You keep them together long enough to prevent the retreat from becoming a slaughter, but there is no recovering the attack.
Eventually you pull away.
The guards pursue only far enough to make certain you are gone.
When you look back from a safe distance, they are already gathering themselves around the prisoners.
The four captives are pulled back onto the trail.
The surviving guards close around them.
Then the caravan begins moving again.
You will not catch it a second time.
<div class="result-list">
<div class="result-line bad"><span class="label">Outcome</span><span class="value">Defeat</span></div>
<div class="result-line bad"><span class="label">Your losses</span><span class="value"><<print _result.playerLoss>> Population</span></div>
<div class="result-line"><span class="label">Slaver losses</span><span class="value"><<print _result.enemyLoss>></span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<if _result.ok and _result.victory>>
<<button "<span class='choice-text'>Kill Them</span>">><<run setup.brokenChain.chooseOutcome("kill", _result.questId)>><<goto "Quest_BrokenChain_Conclusion">><</button>>
<<button "<span class='choice-text'>Set Them Free</span>">><<run setup.brokenChain.chooseOutcome("free", _result.questId)>><<goto "Quest_BrokenChain_Conclusion">><</button>>
<<button "<span class='choice-text'>Take Them With You</span>">><<run setup.brokenChain.chooseOutcome("take", _result.questId)>><<goto "Quest_BrokenChain_Conclusion">><</button>>
<<elseif _result.ok>>
<<button "<span class='choice-text'>Continue</span>" "Quest_BrokenChain_Conclusion">><</button>>
<<else>>
<<button "<span class='choice-text'>Return to Camp</span>" "Hub_1">><</button>>
<</if>>
</div><<silently>>
<<set _result = setup.brokenChain.applyConclusion()>>
<</silently>>
''<div class="hub-textbox">
<h2>Broken Chain</h2>
<<if not _result.ok>>
<p><<print _result.reason>></p>
<<elseif _result.outcome is "leave">>
You lower your hand.
Nobody moves.
The caravan continues onward.
For a while, you can still see the prisoners between the trees.
Then only the guards.
Then nothing.
The trail remains behind.
You leave it where it is and turn back toward camp.
<<elseif _result.outcome is "defeat">>
The survivors make their way home carrying the wounded and helping those who can barely walk.
The caravan is gone by then.
Whatever awaits the four captives at the Lake City will happen without you.
<<elseif _result.outcome is "kill">>
You look toward the prisoners.
Four people.
Still bound.
Still waiting to learn what your victory means for them.
You give the order.
For a moment, nobody moves.
Then understanding reaches them.
One tries to run.
The rope catches against the others and drags him sideways.
Your people close in.
It ends quickly.
The guards were already defeated.
This blood serves no battle.
Something within you answers anyway.
<div class="result-list">
<div class="result-line good"><span class="label">Blood Aspect</span><span class="value">+4</span></div>
</div>
<<elseif _result.outcome is "free">>
You approach the prisoners.
One steps backward when you reach for the rope.
You ignore the movement and cut through the binding.
Then the next.
Then the next.
The last rope falls into the dirt.
All four remain where they are.
Waiting.
You gesture toward the open country.
Nothing stops them.
One of the women looks at you for several moments before finally moving.
The others follow.
Nobody from your warband gives chase.
Soon the four are walking beneath their own direction for the first time since your scouts found them.
Something within you answers.
<div class="result-list">
<div class="result-line good"><span class="label">Life Aspect</span><span class="value">+4</span></div>
</div>
<<elseif _result.outcome is "take">>
You look toward the prisoners.
Then toward the path back to camp.
Their captors are gone.
Their ropes do not need to remain.
You have them cut away.
For a few breaths, hope appears on more than one face.
Then you gesture toward your warband.
Toward the road home.
They understand.
The ropes are gone.
The decision is not theirs.
Your people fall into formation around them.
The four follow.
What other choice do they have?
The march back toward camp takes the rest of the daylight. Your warband keeps its pace, and the four fall in behind, watched but unbound. They walk close together, speaking in low voices among themselves, glancing at your people and at the treeline in equal measure.
When your warband stops for the night, they are given food and a place by the fire. They eat without speaking. One of the women, the younger of the two, watches you across the flames.
She is lean from days on the road, her dark hair tangled, a bruise fading along her jaw where one of the slavers handled her. She holds herself differently from the women of your tribe, narrow through the waist, light-footed even after the long march. When she looks at you there is no gratitude in it, only a weighing of what comes next.
Later, when the small night camp has settled and the fire has burned low, she comes to where you sit apart from the others. She stands at the edge of your light, arms folded, and says something quiet. Her voice is low, direct. She steps closer, then closer again, until she is near enough to touch.
Your hand finds her hip, and the warmth of her sinks through rough fabric. She presses her palm flat against your chest, fingers curling into the leather, then leans in and puts her mouth against your neck. Salt, woodsmoke, the dried sweat of a long frightened day on the road.
You pull her down onto the furs. She helps, tugging at the cord at your waist, her hands quick but not practiced, fumbling once before she frees you. Her fingers close around your cock and squeeze, testing the weight, her thumb running along a thick vein, and her lips part without sound.
She pushes her own clothing aside, revealing a thatch of dark curls between her thighs, her pussy already flushed and wet. She guides you between her legs, the head of your cock pressing against her opening, and she takes you in one slow push that draws a low groan from deep in her chest. Her inner walls stretch tight around your girth, hot and clenching, a small whimper catching in her throat as she adjusts.
Her thighs lock around your hips. She rides you with a hard grinding rhythm, hands braced on your chest, head bowed, hair curtaining her face.
<<nsfwimg "images/expeditions/broken_chain/1.webm">>
Each stroke drives you deep, the wet squelch of her pussy loud in the quiet camp, her juices coating your shaft and pooling at the base. She moves like someone who has decided to take what pleasure she can from this, here, now, with this stranger who killed the men who held her and then told her to follow.
Her pace quickens. Her nails drag across your skin, leaving pale lines that welt and fade. Her breathing turns ragged, each exhale a sharp bitten-off sound, her hips rolling faster, grinding her clit against you with every downstroke.
She comes with a sharp gasp, her whole body clenching hard around your cock, her pussy spasming in tight rhythmic pulses, hips stuttering through the aftershocks before she drops forward against your chest. You grip her hips and thrust up into her, hard, chasing the last clench of her orgasm, and finish inside her with a deep groan, your cum pumping into her in thick spurts while her body milks every drop.
<<nsfwimg "images/expeditions/broken_chain/2.webm">>
She rolls off without a word, breathing hard, your cum leaking from her swollen pussy onto the furs beneath her. She stares up through branches at the sky. After a while she pulls her clothing into place and walks back to the fire where the others sleep.
Morning comes. The group rises. The march continues toward camp.
By the time your warband returns to camp, word of the fight has already travelled among those who came back ahead of you.
Four unfamiliar people enter with your warriors.
Nobody mistakes them for visitors.
Whatever bargain placed them on the road to the Lake City is finished.
A different arrangement has taken its place.
<div class="result-list">
<div class="result-line good"><span class="label">Population</span><span class="value">+4</span></div>
<div class="result-line bad"><span class="label">Stability</span><span class="value">-5</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to Camp</span>" "Hub_1">><</button>>
</div><<silently>>
<<set _exp = setup.brokenChain.enterExpedition()>>
<<set _mishanKnown = setup.brokenChain.hasDiscoveredMishan()>>
<</silently>>
''<div class="hub-textbox">
<h2>Broken Chain</h2>
<<if _exp.ok>>
The trail is easy enough to recover.
Eight armed people and four prisoners leave plenty behind.
Flattened grass.
Broken stems.
Footprints where the ground is soft.
You take one warband and leave the rest of the tribe behind.
The tracks carry you onward until voices begin drifting through the trees.
You raise a hand.
Your people stop.
From there, you follow more carefully.
The group moves ahead at an unhurried pace.
Four captives walk between the guards, wrists bound before them.
One stumbles.
The man behind him catches the rope and jerks hard enough to nearly pull him from his feet.
Nobody else reacts.
You continue shadowing them.
Close enough now to hear pieces of conversation.
Their speech is unfamiliar to your warriors.
Its meaning reaches you easily enough.
One complains that they should have taken another route.
Another laughs at him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“And lose another half-day? They walk well enough.”</span>
</div>
Someone farther ahead answers.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“They only need to walk until the lake.”</span>
</div>
The first man mutters something.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“Then let the city worry about them.”</span>
</div>
They laugh.
A little later, one of the men glances back at the prisoners.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“Four should fetch something.”</span>
</div>
Another laughs.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“More than they'd ever be worth wandering around out here.”</span>
</div>
A third voice answers.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“Everything is worth more once it reaches the lake.”</span>
</div>
Then you hear the part that matters.
They intend to sell the prisoners.
<<if not _mishanKnown>>
At the <b>Lake City</b>.
Whatever place that is, these men clearly expect to find buyers there.
<<else>>
At the <b>Lake City</b>.
Mishan.
So that is where they are taking them.
<</if>>
You keep watching.
Eight armed guards.
Four bound captives.
Your people wait for your decision.
The caravan will continue on whether you interfere or not.
<div class="result-list">
<div class="result-line bad"><span class="label">Action Points</span><span class="value">-1</span></div>
</div>
<<else>>
<p><<print _exp.reason>></p>
<</if>>
</div>''
<div class="hub-buttons">
<<if _exp.ok>>
<<button "<span class='choice-text'>Attack the Caravan</span>">><<goto "Quest_BrokenChain_Leadership">><</button>>
<<button "<span class='choice-text'>Leave Them Be</span>">><<run setup.brokenChain.chooseOutcome("leave")>><<goto "Quest_BrokenChain_Conclusion">><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 1 Action Point."><span class="choice-text">Investigate the Caravan</span></span>
<<button "<span class='choice-text'>Return to Camp</span>" "Hub_1">><</button>>
<</if>>
</div><<silently>>
<<set _check = setup.brokenChain.prepareLeadershipCheck()>>
<<set _canBattle = setup.raidV1.getAvailableWarbandCount(Number($pops ?? 0)) > 0>>
<</silently>>
''<div class="hub-textbox">
<h2>Broken Chain</h2>
<<if _check.ok>>
<div class="result-list result-list-check">
<div class="result-line result-line-check-outcome <<if _check.success>>is-pass<<else>>is-fail<</if>>">
<span class="label">Leadership Check</span>
<span class="value"><<if _check.success>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _check.roll>></span></div>
<div class="result-line"><span class="label">Leadership + d20 vs DC</span><span class="value"><<print _check.total>> / <<print _check.dc>></span></div>
</div>
You decide the caravan will not continue unchallenged.
Quiet instructions pass through your group.
Men spread through the brush.
Spears come free.
The guards remain unaware.
For now.
You wait until the caravan reaches the ground you want.
Then raise your hand.
<<if _check.success>>
Your people move together.
Exactly when they should.
The first warning comes from one of the guards near the rear.
Too late.
Your warband is already closing from both sides.
The prisoners are shoved toward the center.
Weapons rise.
A broader man near the front barks orders and the guards pull together around him, but the confusion belongs to them.
You have the attack you wanted.
<div class="result-list">
<div class="result-line good"><span class="label">Battle Role</span><span class="value">You are the Attacker</span></div>
<div class="result-line good"><span class="label">Your Warband</span><span class="value">+1 Morale</span></div>
<div class="result-line good"><span class="label">Player Resolve</span><span class="value">+1</span></div>
</div>
<<else>>
Someone moves early.
A branch snaps beneath a foot.
One of the guards turns immediately.
His eyes find the movement in the brush.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard</span>
<span class="dialogue-line">“There!”</span>
</div>
The entire caravan reacts.
The prisoners are shoved aside.
Weapons come free.
The man at the front starts shouting orders before your people are fully in position.
Within moments, the guards are moving toward you rather than waiting to be surrounded.
The ambush is gone.
Now you have a fight.
<div class="result-list">
<div class="result-line bad"><span class="label">Battle Role</span><span class="value">You are the Defender</span></div>
<div class="result-line bad"><span class="label">Enemy Resolve</span><span class="value">+1</span></div>
</div>
<</if>>
<<else>>
<p><<print _check.reason>></p>
<</if>>
</div>''
<div class="hub-buttons">
<<if _check.ok and _canBattle>>
<<button "<span class='choice-text'>Begin Combat</span>">><<set _battle = setup.brokenChain.startBattle()>><<if _battle.ok>><<goto "Raid_V1_Battle">><</if>><</button>>
<<elseif _check.ok>>
<span class="macro-button disabled" aria-disabled="true" title="Your tribe cannot field a warband."><span class="choice-text">Begin Combat</span></span>
<<else>>
<<button "<span class='choice-text'>Return to Camp</span>" "Hub_1">><</button>>
<</if>>
</div><<silently>>
<<set _result = setup.dynamicQuests.resolveAbandonedSuppliesQuest()>>
<</silently>>
''<div class="hub-textbox">
<h2>Abandoned Supplies</h2>
<<if _result.ok>>
<p>The lead you got from <<print _result.sourceTribeName>> proves true. Beneath brush, stones, and old woven covers, your people find supplies left from a hurried migration: food wrapped against damp, workable materials, and small goods still worth carrying home.</p>
<div class="result-line good"><span class="label">Recovered</span><span class="value"><<print _result.summary>></span></div>
<<else>>
<p><<print _result.reason>></p>
<p>Whatever memory pointed here has gone thin, or the useful things have already been taken.</p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _result = setup.dynamicQuests.grantBattlefieldBurialItem()>>
<<set _energy = Math.max(0, Math.floor(Number($energy ?? 0)))>>
<</silently>>
''<div class="hub-textbox">
<h2>Unburied Battlefield</h2>
<<if _result.ok>>
<p>The lead from <<print _result.sourceTribeName>> brings your people to a low, scarred place where grass has grown through old blood. Broken shafts, split hide, and quiet bones mark where two tribes met and neither had time to make the ending clean.</p>
<p>A careful search turns up one thing still worth carrying home.</p>
<div class="result-list">
<div class="result-line good"><span class="label">Found</span><span class="value"><<print _result.itemName>></span></div>
<div class="result-line"><span class="label">Tier</span><span class="value"><<print _result.itemTier>></span></div>
<div class="result-line"><span class="label">Effect</span><span class="value"><<print _result.itemEffect>></span></div>
</div>
<p>The dead remain where they fell. The tribe who gave you the lead said they had been hurrying toward good hunting ground and could not stop long enough to raise proper mounds. They gave you leave to take whatever had value, but they also asked that someone give the fallen a better sendoff than this open silence.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<if _energy >= 1>>
<<button "<span class='choice-text'>Give Them a Proper Burial</span><span class='choice-note'>-1 Action Point</span>">><<goto "Quest_Dynamic_BattlefieldBurial_Burial">><</button>>
<<else>>
<span class="macro-button disabled">Give Them a Proper Burial - Need 1 Action Point</span>
<</if>>
<<button "<span class='choice-text'>Go Back to Camp</span><span class='choice-note'>End quest</span>">><<run setup.dynamicQuests.leaveBattlefieldBurialQuest()>><<goto "Hub_1">><</button>>
</div>
<<else>>
<p><<print _result.reason>></p>
<p>Whatever story pointed here has thinned into old ground and ordinary wind.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<</if>>
</div><<silently>>
<<set _result = setup.dynamicQuests.resolveBattlefieldBurialBurial()>>
<</silently>>
''<div class="hub-textbox">
<h2>Burial Mounds</h2>
<<if _result.ok>>
<p>Your people work in a quiet line, scraping earth over the dead and setting stones where names should have been. The mounds are small, but they are deliberate. Spears are laid flat, broken charms tucked beneath soil, and the place stops feeling abandoned.</p>
<p>When word reaches <<print _result.sourceTribeName>>, they remember that you did more than take what was useful.</p>
<div class="result-list">
<div class="result-line bad"><span class="label">Action Points</span><span class="value"><<print _result.energyBefore>> -> <<print _result.energyAfter>></span></div>
<div class="result-line good"><span class="label">Relations</span><span class="value">+<<print _result.relationGain>><<if _result.relationsBefore isnot null>> (<<print _result.relationsBefore>> -> <<print _result.relationsAfter>>)<</if>></span></div>
</div>
<<else>>
<p><<print _result.reason>></p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _q = setup.dynamicQuests.getActiveSmallTribeQuest()>>
<<set _atCamp = setup.dynamicQuests.isQuestAtCamp(_q)>>
<<set _tile = _q ? setup.dynamicQuests.getQuestTile(_q) : null>>
<<set _terrain = _tile ? String(_tile.terrain || "").toLowerCase() : "">>
<</silently>>
''<div class="hub-textbox">
<h2>A Small Tribe</h2>
<<if !_q>>
<p>The shared lead is gone. Whatever small fires were named have moved beyond your reach.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<elseif not _atCamp>>
<p>The signs do not gather here. The small tribe is still somewhere along the marked trail.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<<if _terrain.includes("mountain")>>
<p>The trail climbs into hard country. Smoke thins fast in the wind, but a few sheltered ledges show where people have been sleeping out of sight.</p>
<<elseif _terrain.includes("river")>>
<p>The signs follow wet ground: split reeds, ash near the bank, and shallow prints where baskets were carried over mud.</p>
<<elseif _terrain.includes("lake")>>
<p>Near the still water, low voices carry farther than they should. Small shelters sit back from the shore, half-hidden by reeds and scrub.</p>
<<elseif _terrain.includes("forest")>>
<p>Under the trees, the signs are close and careful: bent fern, bark rubbed smooth by packs, and a cooking pit covered before it cooled.</p>
<<else>>
<p>Across the open ground, the signs are plain enough once you know to look: a cold hearth, trampled grass, and smoke kept low in the distance.</p>
<</if>>
<p>It took a bit of searching, but its clear the lead you were given wasnt false. There doesn't seems to be many of them but still...They seem ready to go down swinging if nothing else. How do you aproach this?</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Attack Them</span><span class='choice-note'>Leadership check, then combat</span>">><<goto "Quest_Dynamic_SmallTribe_Attack">><</button>>
<<button "<span class='choice-text'>Approach With Open Arms</span><span class='choice-note'>Charisma check</span>">><<goto "Quest_Dynamic_SmallTribe_Approach">><</button>>
<<button "<span class='choice-text'>Leave Them Be</span><span class='choice-note'>End the lead</span>">><<goto "Quest_Dynamic_SmallTribe_Leave">><</button>>
</div>
<</if>>
</div><<silently>>
<<set _result = setup.dynamicQuests.resolveSmallTribeAftermath()>>
<</silently>>
''<div class="hub-textbox">
<h2>Aftermath</h2>
<<if not _result.ok>>
<p>There is no battle aftermath to resolve.</p>
<<else>>
<<if _result.victory>>
<p>Once the fighters are down, the rest of them are easily rounded up. Whatever is to be their purpose will be for you to decide from now on</p>
<<else>>
<p>Your line cannot hold them, your men faltering. It doesn't take long for you to make up the difference, but by the time the last of their warriors lies dead on the ground, the rest have managed to scatter to the wind, taking most of their things with them</p>
<</if>>
<div class="result-line bad"><span class="label">Population lost</span><span class="value">-<<print _result.playerLoss>></span></div>
<<if _result.victory>>
<div class="result-line good"><span class="label">People gained</span><span class="value">+<<print _result.popGain>> Population</span></div>
<div class="result-line good"><span class="label">Recovered supplies</span><span class="value"><<print _result.rewardSummary>></span></div>
<<else>>
<p>The quest fails, and the shared lead is cleared from your log.</p>
<</if>>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _q = setup.dynamicQuests.getActiveSmallTribeQuest()>>
<<set _atCamp = setup.dynamicQuests.isQuestAtCamp(_q)>>
<<set _result = setup.dynamicQuests.resolveSmallTribeApproach()>>
<</silently>>
''<div class="hub-textbox">
<h2>A Small Tribe</h2>
<<if !_q>>
<p>There is no small tribe lead to resolve here.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<elseif not _atCamp>>
<p>The small tribe is not at this camp.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<p>You come forward without raised weapons, letting them see open hands and the smile on your face that you hope seems more disarming than threatening</p>
<div class="result-list">
<<if _result.resolved>>
<div class="result-line good">
<span class="label">Charisma check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Charisma check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Charisma + d20 vs DC</span>
<span class="value"><<print _result.total>> / <<print _result.dc>></span>
</div>
<<if _result.resolved>>
<div class="result-line good">
<span class="label">Gift</span>
<span class="value">+<<print _result.goods>> Goods</span>
</div>
<</if>>
</div>
<<if _result.resolved>>
<p>They do not seem to fully trust you, but they lower their weapons. It isn't long before your words have them wrapped around your finger. As you leave your mens hands are heavy from the gifts they are carrying. They might not be well off, but they are certanly a generous people.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<p>Your words land badly. Hands move to spears, and whatever peace might have been made is gone.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Begin Combat</span>">><<run setup.dynamicQuests.startSmallTribeBattle("approach")>><<goto "Raid_V1_Battle">><</button>>
</div>
<</if>>
<</if>>
</div><<silently>>
<<set _q = setup.dynamicQuests.getActiveSmallTribeQuest()>>
<<set _atCamp = setup.dynamicQuests.isQuestAtCamp(_q)>>
<<set _check = setup.dynamicQuests.prepareSmallTribeAttack()>>
<</silently>>
''<div class="hub-textbox">
<h2>A Small Tribe</h2>
<<if !_q>>
<p>There is no small tribe lead to resolve here.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<elseif not _atCamp>>
<p>The small tribe is not at this camp.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<p>Your people tighten their grips on their weapons as you give the sign.</p>
<div class="result-list">
<<if _check.checkOk>>
<div class="result-line good">
<span class="label">Leadership check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Leadership check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Leadership + d20 vs DC</span>
<span class="value"><<print _check.total>> / <<print _check.dc>></span>
</div>
</div>
<<if _check.checkOk>>
<p>Your people move with enough order that the small camp has little time to scatter. You catch the fools off guard!</p>
<<else>>
<p>One of your men trips before you manage to close the distance, and they notice! When you get to them, they are already armed and ready, prepared to go down swinging!</p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Begin Combat</span>">><<run setup.dynamicQuests.startSmallTribeBattle("attack")>><<goto "Raid_V1_Battle">><</button>>
</div>
<</if>>
</div><<silently>>
<<set _result = setup.dynamicQuests.finalizeSmallTribeBattle()>>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : (setup.stopBattle ? setup.stopBattle() : null)>>
<</silently>>
''<div class="hub-textbox">
<h2><<if not _result.ok>>Battle Ended<<elseif _result.victory>>Victory!<<else>>Defeat!<</if>></h2>
<<if not _result.ok>>
<p>There is no small tribe battle to resolve.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<div class="result-line <<if _result.victory>>good<<else>>bad<</if>>"><span class="label">Outcome</span><span class="value"><<if _result.victory>>Victory!<<else>>Defeat!<</if>></span></div>
<div class="result-line bad"><span class="label">Your losses</span><span class="value"><<print _result.playerLoss>> Population</span></div>
<div class="result-line"><span class="label">Small tribe losses</span><span class="value"><<print _result.enemyLoss>> Population</span></div>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Aftermath</span>">><<goto "Quest_Dynamic_SmallTribe_Aftermath">><</button>>
</div>
<</if>>
</div><<silently>>
<<set _result = setup.dynamicQuests.leaveSmallTribeQuest()>>
<</silently>>
''<div class="hub-textbox">
<h2>A Small Tribe</h2>
<<if _result.ok>>
<p>Your people let the small fires remain small. By morning, the trail has no reason to belong to you anymore.</p>
<<else>>
<p>There is no small tribe lead to leave behind.</p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _q = setup.dynamicQuests.getActiveStrangeOmenSiteQuest()>>
<<set _atCamp = setup.dynamicQuests.isQuestAtCamp(_q)>>
<<set _tile = _q ? setup.dynamicQuests.getQuestTile(_q) : null>>
<<set _terrain = _tile ? String(_tile.terrain || "").toLowerCase() : "">>
<</silently>>
''<div class="hub-textbox">
<h2>Strange Omen Site</h2>
<<if !_q>>
<p>The shared omen lead is gone. Whatever place was named no longer answers to the trail.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<elseif not _atCamp>>
<p>The signs do not gather here. The strange place is still somewhere along the marked trail.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
<<else>>
<<if _terrain.includes("mountain")>>
<p>The marked place waits among hard stone and thin wind. At first the shapes look like old pillars, then like teeth, then like people standing too still against the slope.</p>
<<elseif _terrain.includes("river")>>
<p>The river bends around the marked place as if avoiding it. Wet stones seem stacked into arches until you look straight at them, and looking at the water makes it seems like an image of something will appear in the ripples, yet leaves nothing to be seen</p>
<<elseif _terrain.includes("lake")>>
<p>The lake lies flat beside the marked place. Reflections show tall dark shapes where the shore holds only reeds, and footprints lead to the water without coming back.</p>
<<elseif _terrain.includes("forest")>>
<p>The trees grow wrong around the marked place. Trunks line up like worked posts, branches meet like lintels, and every path seems to return to the same quiet center.</p>
<<else>>
<p>The open ground gives the marked place nowhere to hide, yet it still refuses to stay fixed. Stones become posts at the edge of sight, and shadows gather into doorways that are gone when approached. What exactly is hapening here, you do not know, but you can feel the strange energy eminanting from this place</p>
<</if>>
<p>The tribe that named this place spoke of people walking here in the night, then waking with dirt on their feet and no memory of why they came. Now your own people stand close enough to feel the air pull at their thoughts...Perhaps you can pull back?</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Harness the Strange Energies</span><span class='choice-note'>Wisdom check</span>">><<goto "Quest_Dynamic_StrangeOmenSite_Harness">><</button>>
<<button "<span class='choice-text'>Get Away From This Strange Place</span><span class='choice-note'>End the lead</span>">><<goto "Quest_Dynamic_StrangeOmenSite_Leave">><</button>>
</div>
<</if>>
</div><<silently>>
<<set _q = setup.dynamicQuests.getActiveStrangeOmenSiteQuest()>>
<<set _atCamp = setup.dynamicQuests.isQuestAtCamp(_q)>>
<<set _result = setup.dynamicQuests.resolveStrangeOmenSiteHarness()>>
<</silently>>
''<div class="hub-textbox">
<h2>Strange Omen Site</h2>
<<if !_q>>
<p>There is no strange omen lead to resolve here.</p>
<<elseif not _atCamp>>
<p>The omen site is not at this camp.</p>
<<else>>
<p>You walk around the place a bit, following your instincts and something found even deepr within you cant name. You touch a rock here, draw a line on the floor there...You ask the place to answer. For a breath, the shapes around you become certain. Lines. Gates. Pillars. All seem to become fixed, only for a moment.</p>
<div class="result-list">
<<if _result.resolved>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print _result.total>> / <<print _result.dc>></span>
</div>
<<if _result.resolved>>
<div class="result-line good">
<span class="label">Belief</span>
<span class="value">+<<print _result.beliefGain>></span>
</div>
<div class="result-line good">
<span class="label">Zeal</span>
<span class="value">+<<print _result.zealGain>></span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Action Points</span>
<span class="value"><<print _result.energyLossText>></span>
</div>
<</if>>
</div>
<<if _result.resolved>>
<p>And you capitalize on the oportunity. You take a deep breath, open your arms, and the very energy that seems to be creating the scene before you starts flowing into you</p>
<<else>>
<<if _result.energyLoss > 0>>
<p>But it doesn't last. As you attempt to absorb the energies that make up this place, your focus falters, shapes become uncertain again, and you feel the strange energies that were coalescing leave your body, taking some of your energy with them.</p>
<<else>>
<p>The attempt drinks at empty hands. Nothing useful comes, only silence.</p>
<</if>>
<</if>>
<p>When you are done, you give your people a sign to move back to camp, with you leading from the front...But as you look back one final time, The strange structures you swear were there a moment ago turn back to normal trees, boulders, and whatever else, leaving nothing behind...Strange</p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _result = setup.dynamicQuests.leaveStrangeOmenSiteQuest()>>
<</silently>>
''<div class="hub-textbox">
<h2>Strange Omen Site</h2>
<<if _result.ok>>
<p>You give a sign to your people toback away before the place can have more of an effect.</p>
<p>They listent, and start backing away Towards camp, with you leading from the front...Yet when you turn back the strange structures you swear were there a moment ago are gone replaced by normal trees, boulders, and whatever else, leaving nothing behind....Strange</p>
<<else>>
<p>There is no strange omen lead to leave behind.</p>
<</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Camp</span>">><<goto "Hub_1">><</button>>
</div>
</div><<silently>>
<<set _q = setup.federation.getActiveTradeGuardQuest()>>
<<set _atCamp = setup.federation.isQuestAtCamp(_q)>>
<<set _scenario = setup.federation.getTradeGuardScenario(_q)>>
<<set _sponsor = _q ? _q.sponsorName : "the federation traders">>
<<set _target = _q ? _q.targetName : "the outside tribe">>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Guard the Deal</h2>
<<if !_q>>
<p>The trade obligation is gone. Whatever meeting was planned has passed beyond your reach.</p>
<<elseif not _atCamp>>
<p>The meeting is not here. The marked place still waits elsewhere on the map.</p>
<<elseif _scenario is "target_trouble">>
<p>The deal begins badly. The people of <b><<print _target>></b> press too close, hands near weapons, voices loud enough to turn trade into threat.</p>
<p>The traders from <b><<print _sponsor>></b> look to you before the exchange breaks.</p>
<<elseif _scenario is "sponsor_attack">>
<p>The bargain was never only a bargain. The traders from <b><<print _sponsor>></b> wait until the goods are visible, then their warriors begin to move around <b><<print _target>></b>.</p>
<p>They expect you to understand the opportunity.</p>
<<else>>
<p>The meeting is tense, but no spear is raised. Goods are counted, hands hover over bundles, and both sides watch you as much as they watch each other.</p>
<</if>>
</div>''
<div class="hub-buttons">
<<if _q and _atCamp and _scenario is "target_trouble">>
<<button "Intimidate Them">><<set $federationTradeGuardAction = "intimidate">><<goto "Quest_Federation_TradeGuard_Check">><</button>>
<<button "Back Off">><<set $federationTradeGuardAction = "back_off">><<goto "Quest_Federation_TradeGuard_Simple">><</button>>
<<elseif _q and _atCamp and _scenario is "sponsor_attack">>
<<button "Join Them">><<set $federationTradeGuardBattleMode = "join_sponsor_attack">><<run setup.federation.startTradeGuardBattle("join_sponsor_attack")>><<goto "Raid_V1_Battle">><</button>>
<<button "Refuse">><<set $federationTradeGuardAction = "refuse_attack">><<goto "Quest_Federation_TradeGuard_Simple">><</button>>
<<button "Help the Other Tribe">><<set $federationTradeGuardBattleMode = "help_target_defense">><<run setup.federation.startTradeGuardBattle("help_target_defense")>><<goto "Raid_V1_Battle">><</button>>
<<elseif _q and _atCamp>>
<<button "Negotiate a Better Deal">><<set $federationTradeGuardAction = "negotiate">><<goto "Quest_Federation_TradeGuard_Check">><</button>>
<<button "Let Them Handle It">><<set $federationTradeGuardAction = "let_normal">><<goto "Quest_Federation_TradeGuard_Simple">><</button>>
<</if>>
</div><<silently>>
<<set _r = setup.federation.resolveTradeGuardBattleAftermath()>>
<<set _mode = (_r and _r.battle) ? (_r.battle.mode ?? "") : "">>
<<set _victory = (_r and _r.battle) ? _r.battle.playerVictory : false>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Aftermath</h2>
<<if not _r.ok>><p><<print _r.reason>></p><<else>>
<<if _mode is "target_trouble_defense" and _victory>>
<p>The outside tribe breaks first. The traders finish the deal under hard watch and give you a proper cut.</p>
<<elseif _mode is "target_trouble_defense">>
<p>The outside tribe forces the meeting apart. You kept some order, but not enough to call it a clean answer.</p>
<<elseif _mode is "join_sponsor_attack" and _victory>>
<p>The ambush works. Your federation ally laughs over the captured goods and pays you a heavy cut.</p>
<<elseif _mode is "join_sponsor_attack">>
<p>The ambush turns ugly. Your ally appreciates that you stood with them, but the spoils are gone.</p>
<<elseif _mode is "help_target_defense" and _victory>>
<p>You turn on the ambush and break it. Your former ally leaves the federation, while the outside tribe remembers the rescue.</p>
<<else>>
<p>You turn on the ambush, but cannot stop it. Your former ally leaves the federation anyway, and the outside tribe gives only strained thanks.</p>
<</if>>
<div class="result-list">
<<if _r.goods>><div class="result-line good"><span class="label">Goods</span><span class="value">+<<print _r.goods>></span></div><</if>>
<<if _r.sponsorRelation>><div class="result-line <<if _r.sponsorRelation.delta >= 0>>good<<else>>bad<</if>>"><span class="label"><<print _r.sponsorRelation.tribeName>></span><span class="value"><<if _r.sponsorRelation.delta >= 0>>+<</if>><<print _r.sponsorRelation.delta>> relations</span></div><</if>>
<<if _r.targetRelation>><div class="result-line <<if _r.targetRelation.delta >= 0>>good<<else>>bad<</if>>"><span class="label"><<print _r.targetRelation.tribeName>></span><span class="value"><<if _r.targetRelation.delta >= 0>>+<</if>><<print _r.targetRelation.delta>> relations</span></div><</if>>
<<if _r.removedMember and _r.removedMember.removed>><div class="result-line bad"><span class="label">Federation</span><span class="value"><<print _r.removedMember.tribeName>> leaves</span></div><</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons"><<button "Return to Camp">><<goto "Hub_1">><</button>></div><<silently>>
<<set _r = setup.federation.finalizeTradeGuardBattle()>>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : (setup.stopBattle ? setup.stopBattle() : null)>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2><<if _r.ok>><<print _r.title>><<else>>Battle Ended<</if>></h2>
<<if not _r.ok>><p><<print _r.reason>></p><<else>>
<div class="result-list">
<div class="result-line <<if _r.playerVictory>>good<<else>>bad<</if>>"><span class="label">Outcome</span><span class="value"><<print _r.title>></span></div>
<div class="result-line bad"><span class="label"><<print _r.attackerName>> losses</span><span class="value">-<<print _r.attackerLoss>> Population</span></div>
<div class="result-line bad"><span class="label"><<print _r.defenderName>> losses</span><span class="value">-<<print _r.defenderLoss>> Population</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<if _r and _r.ok>><<button "Aftermath">><<goto "Quest_Federation_TradeGuard_Aftermath">><</button>><</if>>
</div><<silently>>
<<set _action = $federationTradeGuardAction ?? "negotiate">>
<<set _q = setup.federation.getActiveTradeGuardQuest()>>
<<set _sponsor = _q ? _q.sponsorName : "the federation traders">>
<<set _target = _q ? _q.targetName : "the outside tribe">>
<<set _r = setup.federation.resolveTradeGuardCheckChoice(_action)>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Guard the Deal</h2>
<<if not _r.ok>>
<p><<print _r.reason>></p>
<<else>>
<div class="result-line <<if _r.ok and (_r.checkOk or _r.resolved or _r.goods)>>good<<else>>bad<</if>>"><span class="label"><<print _r.statLabel>> check</span><span class="value"><<print _r.roll>> + <<print _r.stat>> = <<print _r.total>> vs DC <<print _r.dc>></span></div>
<<if _action is "intimidate" and _r.startsBattle>>
<p><b><<print _target>></b> laughs off the warning and reaches for weapons.</p>
<<elseif _action is "intimidate">>
<p>Your threat lands cleanly. <b><<print _target>></b> backs down, and <b><<print _sponsor>></b> completes the deal under your shadow.</p>
<<elseif _r.checkOk>>
<p>You read the exchange well and press for better terms without breaking the meeting. <b><<print _sponsor>></b> leaves pleased.</p>
<<else>>
<p>Your words tangle the bargain more than they help, but the deal survives and a smaller cut still comes your way.</p>
<</if>>
<<if _r.startsBattle>>
<p>The meeting collapses into a fight.</p>
<<else>>
<div class="result-list">
<<if _r.goods>><div class="result-line good"><span class="label">Goods</span><span class="value">+<<print _r.goods>></span></div><</if>>
<<if _r.sponsorRelation>><div class="result-line good"><span class="label"><<print _r.sponsorRelation.tribeName>></span><span class="value">+<<print _r.sponsorRelation.delta>> relations</span></div><</if>>
<<if _r.targetRelation>><div class="result-line bad"><span class="label"><<print _r.targetRelation.tribeName>></span><span class="value"><<print _r.targetRelation.delta>> relations</span></div><</if>>
</div>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<if _r and _r.startsBattle>>
<<button "Begin Combat">><<set $federationTradeGuardBattleMode = "target_trouble_defense">><<run setup.federation.startTradeGuardBattle("target_trouble_defense")>><<goto "Raid_V1_Battle">><</button>>
<<elseif _r and _r.ok>>
<<button "Return to Camp">><<goto "Hub_1">><</button>>
<</if>>
</div><<silently>>
<<set _action = $federationTradeGuardAction ?? "let_normal">>
<<set _q = setup.federation.getActiveTradeGuardQuest()>>
<<set _sponsor = _q ? _q.sponsorName : "the federation traders">>
<<set _target = _q ? _q.targetName : "the outside tribe">>
<<set _r = setup.federation.resolveTradeGuardSimpleChoice(_action)>>
<</silently>>
''<div class="hub-textbox federation-event-text">
<h2>Guard the Deal</h2>
<<if not _r.ok>><p><<print _r.reason>></p><<else>>
<<if _action is "back_off">>
<p>You step back and let <b><<print _target>></b> have the field. The federation traders survive the insult, but they do not forget who watched it happen.</p>
<<elseif _action is "refuse_attack">>
<p>You refuse to join the ambush and let the ugly moment pass without your hand on it.</p>
<<else>>
<p>You let the traders handle their own bargain. Your presence steadies the meeting, and <b><<print _sponsor>></b> shares a modest cut afterward.</p>
<</if>>
<div class="result-list">
<<if _r.goods>><div class="result-line good"><span class="label">Goods</span><span class="value">+<<print _r.goods>></span></div><</if>>
<<if _r.sponsorRelation>><div class="result-line <<if _r.sponsorRelation.delta >= 0>>good<<else>>bad<</if>>"><span class="label"><<print _r.sponsorRelation.tribeName>></span><span class="value"><<if _r.sponsorRelation.delta >= 0>>+<</if>><<print _r.sponsorRelation.delta>> relations</span></div><</if>>
<<if _r.targetRelation>><div class="result-line good"><span class="label"><<print _r.targetRelation.tribeName>></span><span class="value">+<<print _r.targetRelation.delta>> relations</span></div><</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons"><<button "Return to Camp">><<goto "Hub_1">><</button>></div><<silently>>
<<set _expedition = setup.hollowHill.enterExpedition()>>
<<set _heartwood = setup.hollowHill.getHeartwoodStatus()>>
<</silently>>
''<div class="hub-textbox">
<<if _expedition.ok>>
The opening is exactly as the scouts described it.
Worked stone surrounds the entrance, softened by age but not enough to hide what it once was.
You descend.
The air cools quickly.
Daylight dwindles behind you as the passage bends deeper into the mountain. Rotten timbers jut from the walls at uneven angles. Rust stains the stone beneath old metal fittings. Here and there lie fragments of tools shaped with a precision your people could not hope to reproduce.
Then come the bones.
One skeleton lies beneath a fallen support, its ribs crushed flat beneath stone.
Another rests farther on, curled against the wall.
There are more beyond it.
The collapse ahead is enormous.
Broken beams, shattered rock, and compacted earth fill the passage almost completely. Yet near the upper edge, a narrow opening remains.
Barely large enough for a body.
Loose stone shifts when you test it.
You find yourself hard-pressed to imagine sending even the hardiest or smallest of your tribe through there.
Still...
You might be able to do it.
<<else>>
The expedition is no longer available here.
<</if>>
</div>''
<div class="hub-buttons">
<<if _expedition.ok>>
<<if $energy >= 1>>
<<button "<span class='choice-text'>Force your way through. — Endurance DC 16</span>">>
<<run setup.hollowHill.startEnduranceAttempt()>>
<<goto "Quest_HollowHill_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 1 Action Point."><span class="choice-text">Force your way through. — Endurance DC 16</span></span>
<</if>>
<<if _heartwood.canUse>>
<<button "<span class='choice-text'>If human flesh isn't enough, perhaps wooden flesh might be. — Heartwood Flesh, 10 Belief</span>">>
<<run setup.hollowHill.startHeartwoodAttempt()>>
<<goto "Quest_HollowHill_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="<<print _heartwood.reason>>"><span class="choice-text">If human flesh isn't enough, perhaps wooden flesh might be. — Heartwood Flesh, 10 Belief</span></span>
<</if>>
<<button "Turn back for now.">><<goto "Hub_1">><</button>>
<</if>>
</div><<silently>>
<<set _attempt = setup.hollowHill.getAttempt()>>
<</silently>>
''<div class="hub-textbox">
<<if _attempt and _attempt.resolved>>
<<if _attempt.route is "endurance">>
<div class="result-list result-list-check">
<<if _attempt.success>>
<div class="result-line good"><span class="label">Endurance check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Endurance check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _attempt.roll>></span></div>
<div class="result-line"><span class="label">Endurance + d20 vs DC</span><span class="value"><<print _attempt.total>> / <<print _attempt.dc>></span></div>
</div>
<</if>>
<<if _attempt.route is "endurance" and _attempt.success>>
You enter the gap sideways.
There is barely enough room.
Stone presses against your shoulder and hip as you work deeper into the collapse. Dust fills your mouth. Every breath tastes of old earth and dry rot.
The passage narrows.
You keep moving.
A broken timber catches against your back. You twist beneath it, forcing yourself farther through until the wood gives with a brittle crack.
Something shifts above you.
Pebbles strike first.
Then a slab drops hard against your shoulder.
Skin peels away against the stone, revealing wet red beneath it.
You brace yourself against the opposite wall before the weight can force you flat.
For several breaths, you remain there, half-buried beneath stone.
Then you push.
Slowly, the slab rises.
Your shoulder knits beneath it even as rough stone scrapes the newly formed flesh raw again.
You keep pushing.
Loose rock spills around your legs.
One piece catches your thigh hard enough to tear skin before tumbling away. Another grinds across your ribs as you drag yourself forward.
Damage accumulates.
Then disappears.
Then accumulates again.
Your body repairs itself almost as quickly as the mountain can abuse it.
Almost.
Your chest scrapes against stone.
Your knees grind through grit and splintered wood.
Your fingers split against sharp rock as you search for purchase, seal, then split again.
Still, you continue.
At last, your hand finds open air.
You pull yourself through.
The tunnel beyond opens wider than anything near the entrance.
Much wider.
The darkness stretches ahead through passages cut directly into the mountain.
Old supports line the walls in long, repeating rows. Metal tracks or channels run through parts of the floor. Broken carts, chains, tools, baskets, and collapsed shelving lie scattered everywhere.
Most are too ruined to be used for their original purpose.
That does not mean what you have found is anything short of a gold mine for your tribe.
There are piles of worked stone. Pieces of metal. Timber protected from the worst of the damp. Containers filled with material whose original purpose has long since been forgotten.
And this is only what lies close to the collapse.
Then you notice the light.
Faint.
Little more than a pale line spilling through a heap of stone farther along one of the galleries.
You approach.
Another entrance.
Or what remains of one.
The outer side has collapsed almost completely, but this blockage is nothing like the one you just forced yourself through. The stones are smaller. Looser. Most could be shifted by hand.
You pull one free.
Then another.
Daylight grows brighter.
By the time you stop, a gap large enough to look through has opened onto the mountainside beyond.
Your people can finish the rest.
They will not need to crawl through the path you took.
The people who built this place are gone.
Their tools are beyond anything your tribe could reproduce.
Their methods are lost.
None of that changes what remains.
There is enough here to strip, break apart, carry away, and reuse for years.
The mountain has already been opened once.
Now, you have opened it again.
<<elseif _attempt.route is "endurance">>
You force yourself into the gap.
For a time, it works.
You crawl deeper through the collapse, shoulders grinding against stone while loose earth spills beneath your hands.
Then the passage tightens.
You twist sideways and push farther.
A mistake.
Something moves above you.
The first stone catches your back.
The second drives you flat.
For several moments you can do little more than hold yourself rigid while the weight settles around you.
Dust fills your mouth and nose.
You shove upward.
Nothing.
Again.
The stone moves barely enough for you to drag one knee backward.
Then another.
Getting out takes far longer than getting in.
By the time you finally pull yourself free of the collapse, your arms tremble from the effort and your skin is covered in cuts, dust, and bruises.
The opening remains.
So does whatever lies beyond it.
Today, the mountain wins.
<<else>>
You call on the power beneath your skin.
Not gently.
Flesh tightens.
Muscle hardens.
The change spreads deeper than usual, through sinew and bone, until your body feels less like something born and more like something grown from the heart of an ancient tree.
Then you enter the collapse.
Stone closes around you almost immediately.
You push forward.
A jagged edge drags across your shoulder and fails to open the skin.
A broken beam presses against your ribs.
You keep moving.
The passage narrows until there should not be enough room left to continue.
You continue anyway.
Rock shifts above you.
A slab falls.
It strikes your back with enough force to drive your hands into the dirt.
For an instant, the mountain seems to settle its weight upon you.
You rise beneath it.
Stone grinds against hardened flesh as you force yourself upward.
The slab tilts.
Then slides aside.
You crawl through the space it leaves behind.
More rubble follows.
You shove through it.
Stone that would split skin instead scrapes uselessly across flesh made dense as old timber. Jagged edges snap. Rotten supports crack beneath your weight.
The collapse yields piece by piece.
By the time you emerge on the other side, the path behind you has partially collapsed again.
It no longer matters.
The tunnel ahead is vast.
Long galleries disappear into darkness.
Ancient supports line the walls. Metal tracks or channels cut across the floor. Broken carts, chains, tools, baskets, and shattered mechanisms lie beneath layers of dust.
Bones lie among them.
Some beneath fallen stone.
Others where their owners seem simply to have stopped.
Whatever happened here ended badly.
But it ended a very long time ago.
Most of the machinery is useless now.
Your tribe could not reproduce it even if it were whole.
The people who built this place understood stone, timber, and metal in ways your followers do not.
Yet they left behind more than knowledge.
Worked material lies everywhere.
Metal fittings.
Cut stone.
Old timber.
Discarded tools.
Containers still holding scraps and fragments worth carrying away.
Even ruined equipment can be broken apart.
Even useless machines contain useful pieces.
Then, farther down one of the galleries, you see daylight.
A thin shaft of it slips through a collapsed opening in the mountainside.
You follow it.
The passage ends beneath a mound of broken stone.
This collapse is shallow.
Loose.
Nothing compared to what lies behind you.
You drive both hands into it.
Stone spills outward.
Another shove sends a larger section tumbling down the slope outside.
Light floods into the gallery.
The opening is still too small for your people to use comfortably.
For now.
But a dozen hands could clear the rest without much difficulty.
They will not need your flesh.
They will not need your power.
Only time.
There is enough here to strip, salvage, and reuse for years.
The people who opened this mountain are gone.
Their work remains.
And now, so does a path your tribe can actually follow.
<</if>>
<<if _attempt.success>>
<div class="result-list">
<<if _attempt.route is "heartwood">>
<div class="result-line good"><span class="label">Heartwood Flesh</span><span class="value">Guaranteed success</span></div>
<div class="result-line bad"><span class="label">Belief spent</span><span class="value">-10</span></div>
<</if>>
<div class="result-line good"><span class="label">Task completed</span><span class="value">The Hollow Hill</span></div>
<div class="result-line good"><span class="label">Resource quality</span><span class="value">Rich</span></div>
<div class="result-line good"><span class="label">Feature established</span><span class="value">Forgotten Mineworks</span></div>
<div class="result-line good"><span class="label">Passive Resources</span><span class="value">+25%</span></div>
</div>
<<else>>
<div class="result-list">
<div class="result-line bad"><span class="label">Action Points spent</span><span class="value">-<<print _attempt.initialApSpent + _attempt.extraApSpent>></span></div>
<div class="result-line"><span class="label">Task status</span><span class="value">The Hollow Hill remains open</span></div>
</div>
<</if>>
<<else>>
The expedition has no result to show.
<</if>>
</div>''
<div class="hub-buttons">
<<button "Return to camp.">><<goto "Hub_1">><</button>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* ===========================
Moving Hill – Expedition #1 (ONE-TIME) Pure stat check (wisdom >= 5) Updates quest + sets relocation trigger flag =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* ---- One-time guard: if already done, don't allow repeat ---- */
<<if $questFlags["q_moving_hill_01_exp1_done"]>>
<<set _alreadyDone = true>>
<<else>>
<<set _alreadyDone = false>>
<</if>>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and (String($quests[_i].id) is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* If already done, make sure the quest can't be used as an expedition again */
<<if _alreadyDone and _qIndex >= 0>>
<<set $quests[_qIndex].markerRevealed = false>>
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Stop here if done (prevents rerolling check + reapplying updates) */
<<if _alreadyDone>><<goto "Hub_1">><</if>>
/* ---- Pure stat check ---- */
<<set _stat = setup.player.getStatForCheck("wisdom")>>
<<set _ok = (_stat >= 5)>>
<<set $questLastCheck = {
ok:_ok,
statKey:"wisdom",
stat:_stat,
dc:5,
roll:0,
total:_stat
}>>
/* Update quest text (keep it ACTIVE, but REMOVE expedition repeat) */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Moving Mountain">>
<<if $questLastCheck.ok>>
<<set $quests[_qIndex].desc = "You returned to the site with Rutvig. The ‘hill’ was gone… but the clearing itself felt wrong—too clean, too even, as if something massive once pressed the land flat. If it moved once, it might move again.">>
<<set $quests[_qIndex].objective = "Perhaps you might find the 'hill' again. Perhaps not. Time will tell.">>
<<else>>
<<set $quests[_qIndex].desc = "You returned to the site with Rutvig. There was nothing there—no hill, no tracks, only empty ground and growing doubt. Still… the story won’t leave you alone.">>
<<set $quests[_qIndex].objective = "Relocate the tribe again and see if anything changes in the western lands.">>
<</if>>
<<set $quests[_qIndex].status = "active">>
<<set $quests[_qIndex].markerRevealed = false>>
/* ✅ IMPORTANT: remove the expedition hook so it can't be repeated */
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Flag for a future major event that should trigger on the NEXT relocation */
<<set $questFlags["q_moving_hill_01_waitRelocate"] = true>>
/* Mark this expedition step as done forever */
<<set $questFlags["q_moving_hill_01_exp1_done"] = true>>
/* Optional: keep it highlighted */
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
After deciding to move camp recently, you spend some of your free time following up on the story one of the scouts told you.
With him and a few hunters in tow, you have him lead you to the place where he claims he saw the disappearing hill months ago.
<br><br>
And just as he said, there isn’t really anything to see here.
<br><br>
Some of the hunters whisper among themselves that old Rutvig has finally gone mad—that he’s wasting the chieftain’s time.
<br><br>
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASSED</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAILED</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom vs threshold</span>
<span class="value"><<print $questLastCheck.stat>> / <<print $questLastCheck.dc>></span>
</div>
</div>
<br>
<<if $questLastCheck.ok>>
…But you <i>do</i> notice a few strange things.
<br><br>
The clearing is quite large—unnaturally so.
The grass that covers it also seems shorter than the grass farther out,
and the few trees along the edges look like little more than saplings…
<</if>>
<br><br>
…At any rate, you doubt you’ll find anything here anytime soon.
You head back to camp with little to show for the venture.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</link>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* ===========================
Moving Hill – Expedition #2 (FINAL) - Completes quest - Rewards: +5 Zeal, +50 Belief - Removes expedition hook so it can't be repeated =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* One-time guard (just in case) */
<<if $questFlags["q_moving_hill_01_final_done"]>>
<<goto "Hub_1">>
<</if>>
/* Rewards */
<<set _dZeal = 5>>
<<set _dBelief = 50>>
<<set $zeal = Number($zeal ?? 0) + _dZeal>>
<<set $belief = Number($belief ?? 0) + _dBelief>>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Complete quest + clear expedition anchor */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
/* Remove expedition hook so it can't be repeated */
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Flags */
<<set $questFlags["q_moving_hill_01_final_done"] = true>>
<<set $questFlags["q_moving_hill_01_waitRelocate"] = false>>
/* Clear tracking highlight */
<<if $trackedQuestId is _qid>>
<<set $trackedQuestId = null>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You set out again—this time with your target seen and certain. After a few hours of travel, you finally spot it.
<img src="images/expeditions/MovingHillQuest/StrangeMountain.png" alt="Amogus">
“…It’s the very same one… how did it get here?” Rutvig says.
And true to Rutvig’s word, it looks exactly as he described it: unnaturally symmetrical, its slopes too even, its edges too smooth. Grass covers it in a way that almost looks <i>placed</i> there—planted, not grown.
And yet nothing about it is concrete proof. Nothing you can point to and say <i>it wasn’t always here</i>, that it isn’t simply a strange, oversized hill.
You step closer.
The slope is too steep for most men to climb easily. You reach out and trace your hand along the edge. Beneath the grass and moss, your fingers find stone—smooth, worked smooth, as if shaped long ago.
The instant you touch it, the ground begins to rumble.
Not a distant tremor—something close. Something waking. Like the first warning of an earthquake.
Your men tighten their grips and raise their spears. Instinct screams at them to run… but they don’t.
Because you’re still standing there. Because you haven’t moved.
And then you feel it—something faint, almost imperceptible. A presence brushing against you. It slips into you as easily as breath, becomes a part of you, and settles somewhere deep inside, as if it had always belonged there.
The rumbling stops.
You turn to your men, and casually inform them that the mountain wont be causing any more issues.
The certainty in your voice is simple and absolute—and they believe you at once. You order them to head back to camp.
As you follow after them, you glance back one last time at the strange hill.
You don’t know how you know. You don’t know <i>why</i>. But you know it as surely as you know your own name:
It won’t be moving anymore.
<div class="result-list">
<div class="result-line good">
<span class="label">Belief gained</span>
<span class="value">+<<print _dBelief>></span>
</div>
<div class="result-line good">
<span class="label">Zeal gained</span>
<span class="value">+<<print _dZeal>></span>
</div>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</link>>
</div><<set _echoes = setup.oldBones.getEchoesStatus()>>
''<div class="hub-textbox">
The little dead man is still here.
Of course he is.
Earth remains packed around much of the body, though your people have obeyed and left the shallow cut undisturbed. The broad ribs. The heavy arms. The strange skull.
None of it has become more familiar in your absence.
Perhaps familiarity was the wrong thing to look for.
</div>''
<div class="hub-buttons">
<<if _echoes.canUse>>
<<link "<span class='choice-text'>Reach Into What Remains [Cost: 15 Belief]</span>">><<if setup.oldBones.commitEchoes()>><<goto "Event_Major_OldBones_Echoes_1">><</if>><</link>>
<<elseif !_echoes.owned>>
<span class="macro-button disabled" aria-disabled="true" title="Requires Lingering Echoes Power."><span class="choice-text">Reach Into What Remains [Cost: 15 Belief]</span></span>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 15 Belief."><span class="choice-text">Reach Into What Remains [Cost: 15 Belief]</span></span>
<</if>>
<<if Number($energy ?? 0) >= 1>>
<<link "<span class='choice-text'>Study the Remains Again [Cost: 1 Action Point]</span>">><<run setup.oldBones.beginWisdomStudy(true)>><</link>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 1 Action Point."><span class="choice-text">Study the Remains Again [Cost: 1 Action Point]</span></span>
<</if>>
<<button "Leave the Dead Man Be for Now" "Hub_1">><</button>>
</div>''<div class="hub-textbox">
<div class="result-list">
<div class="result-line bad"><span class="label">Wisdom check</span><span class="value">FAIL</span></div>
<div class="result-line"><span class="label">wisdom + d20 vs DC</span><span class="value"><<print $oldBonesLastWisdomCheck.total>> / <<print $oldBonesLastWisdomCheck.dc>></span></div>
</div>
<<if $oldBonesRepeatedFailureVariant is 1>>
The extra time spent does not yield better results.
You study every stain, every break, every strange proportion.
By the end, you know the little corpse better.
But you do not understand him any more than before.
<<elseif $oldBonesRepeatedFailureVariant is 2>>
You scrape earth from stone and follow marks that lead nowhere.
Once, you become certain you have found something.
A few moments later, the idea collapses under your own scrutiny.
The dead remain patient with your failure.
<<else>>
Another couple of days, perhaps better spent elsewhere, disappear around the strange remains.
You leave with several new questions and not a single useful answer.
Whatever story the little man carried into his death is still refusing to take shape.
<</if>>
<div class="result-list">
<div class="result-line bad"><span class="label">Action Points</span><span class="value">-1</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the dead to their silence...</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>><<run setup.oldBones.completeStrangeRemains()>><<run setup.oldBones.upsertWhatWeLeaveBehind(false)>><</silently>>
''<div class="hub-textbox">
<div class="result-list">
<div class="result-line good"><span class="label">Wisdom check</span><span class="value">SUCCESS</span></div>
<div class="result-line"><span class="label">wisdom + d20 vs DC</span><span class="value"><<print $oldBonesLastWisdomCheck.total>> / <<print $oldBonesLastWisdomCheck.dc>></span></div>
</div>
This time, you give the dead your full attention.
Not a passing examination while your people wait for orders.
Time.
You scrape hardened earth away a finger's width at a time. Follow stains through stone. Study the position of the body from every side until the strange shape of him stops being the only thing you can see.
And slowly, smaller details begin to matter.
The faint trace along one hip.
The mark leading upward.
The absence beside him.
Something long and heavy once rested against this body.
Metal, you think.
Yet it is not here.
The dead man was travelling. That much becomes clearer the longer you study him. He fell here without shelter, without preparation, without anyone beside him to arrange what remained.
Whatever he carried disappeared before that happened.
A burden cast aside?
No.
Hidden.
You rise and begin studying the land instead.
One route at a time.
One possibility removed after another.
Until, finally, your gaze settles on the land ahead.
You cannot see what lies buried there.
But you no longer need to.
You know where to start looking.
<div class="result-list">
<div class="result-line bad"><span class="label">Action Points</span><span class="value">-1</span></div>
<div class="result-line good"><span class="label">Task Added</span><span class="value">What We Leave Behind</span></div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>See where the trail leads...</span>">>
<<goto "Hub_1">>
<</button>>
</div>''<div class="hub-textbox">
The path back is easier to follow than you expected.
Easier, perhaps, than it should be.
You never marked it. Never gave the place much thought after leaving it behind. And yet your feet seem to know where to go, carrying you through brush and stone with a certainty that leaves little room for doubt. When at last the trees part, you find it waiting.
The tree.
Just as vast as in your dream.
And at its roots lies the body.
Not fresh. It has been too long for that. Time and the wild have already done their work, leaving behind something shrunken and half-taken by the earth. Nearby hangs the carcass of the beast you slew, its remains caught high among the branches where no man could have placed them without effort.
For a while, you simply stand there.
The forest is quiet.
Too quiet.
No animals. No sound of birds.
Then, at the foot of the roots, half-covered by soil and creeping vine, you see it.
A skull.
Human.
His.
The man who attacked you. The man who spilled your blood before you ended him.
Its bone is stained dark where root and soil have pressed into it. Thin tendrils wind through the cracks and empty sockets alike, as though the thing has been feeding, or been fed upon, for a very long time.
And somehow, as you stare at it, you know one thing with absolute certainty.
It does not belong here.
Not anymore.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Take the skull</span>">>
<<goto "Quest_Relic_CorruptTree_Take">>
<</button>>
<<button "<span class='choice-text'>Burn the remains and leave</span>">>
<<goto "Quest_Relic_CorruptTree_Burn">>
<</button>>
</div><<silently>>
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark && Number($belief ?? 0) >= _sparkCost>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullBurnResolved>>
<<if _canSpark>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<</if>>
<<run setup.corruptSkull.destroyRelic()>>
<<run setup.corruptSkull.finishQuest(
"You burned the blood-marked tree and left the place behind. Whatever had been growing there was denied the chance to follow you home.",
"You destroyed the Corrupt Tree before its relic could be claimed."
)>>
<<set $questFlags.corruptSkullBurnResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _canSpark>>
You look at the tree for a long moment.
Then, slowly, you raise one hand toward it, palm open.
Three small white flames flicker into being above your skin. Even at that size, they are enough to push back the weight hanging over this place. For a brief moment, the air feels lighter, cleaner, as though whatever clings to the roots recoils from their presence.
Then the flames drift free.
They split apart as they move, becoming smaller still, tiny pale sparks that float toward the tree.
Their size is a deception.
The moment they touch bark, root, and flesh, the whole thing erupts.
Fire races across the trunk. The body at its roots blackens and curls. Above, the hanging carcass is swallowed in flame. Vines shrivel. Sap hisses. Smoke billows upward in a sudden choking wave as the blaze consumes all three alike.
For a moment, you think you hear a faint scream buried beneath the crackling.
Or perhaps only imagine it.
And for just an instant, you feel as though some smallest part of you is being burned away with it.
Yet perhaps that part was never truly yours any longer.
And if it was, then perhaps it is better for it to disappear here.
When at last the flames begin to die, little remains but blackened wood, ash, and smoke.
The pull that brought you back is gone.
You turn away without looking back.
<<else>>
You gather wood in silence.
Not because you understand what happened here, but because you understand enough. Some places are wrong. Some dead should be burned. Some things are better ended before they are allowed to linger.
The flames take slowly.
Too slowly.
The body blackens first. The vines curl in on themselves. The hanging carcass above spits grease and ash as the fire climbs higher. Even then, the tree does not properly catch. It only smolders, dark sap hissing where the flames bite deepest.
For a while, the smoke is thick enough to sting your eyes.
You stay until there is nothing left to do.
When at last you turn away, the place looks changed, but not clean.
Not truly.
Still, whatever had drawn you back here has faded.
And that is enough.
<</if>>
<div class="result-list">
<<if _canSpark>>
<div class="result-line bad">
<span class="label">Spent</span>
<span class="value">-<<print _sparkCost>> Belief</span>
</div>
<</if>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Corrupt Skull chain ended</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the ashes behind</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullTakeResolved>>
<<run setup.corruptSkull.grantBase()>>
<<run setup.corruptSkull.finishQuest(
"You tore the skull free from the roots and carried it back to camp. Whatever had been feeding there did not stay with the tree.",
"You claimed the Corrupt Skull."
)>>
<<set $questFlags.corruptSkullTakeResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You crouch beside the roots and reach for the skull.
The moment your fingers touch it, a chill shoots through your arm, so sudden and sharp it nearly makes you pull away. The roots resist at first, clinging to the bone as though reluctant to surrender it. You have to wrench it free with more force than should be necessary.
One root tears.
Then another.
Wet strands snap back into the earth.
For an instant, you could swear the whole tree groans.
When at last the skull comes loose, you hold it in both hands and stare.
It is lighter than it should be.
Too light.
Thin roots still cling to it. Small vines coil around the jaw and crown. Dark stains run through the cracks in the bone like old veins. It is ugly. Unclean. Wrong.
And still, you do not throw it away.
Something in you hesitates.
No.
Not hesitation.
Recognition.
It feels strangely natural in your hands, as though you are not taking something foreign to you, but reclaiming something that had been left behind.
In the end, you wrap the thing and bring it back with you.
That night, even before anyone has the chance to truly look at it, the camp feels different.
Subtly, perhaps.
But different all the same.
The air is heavier. Voices lower without meaning to. Fires crackle a little too loudly in the silence between them. No one says anything at first, yet more than one gaze lingers a moment too long in your direction, then away again.
Only time will tell whether that feeling will pass.
Somehow, you doubt it.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained relic</span>
<span class="value">Corrupt Skull</span>
</div>
<div class="result-line bad">
<span class="label">Warning</span>
<span class="value">Relic events can now begin to fire</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>><<set _a = setup.tayan.getInterrogationAvailability()>><</silently>><div class="hub-textbox"><p><b>Tayan is still breathing heavily when you turn your attention back toward him.</b></p>
<p><b>The struggle has left dirt across his clothes and a thin streak of blood along one cheek, though whether it belongs to him or one of his guards is difficult to tell. His hands remain bound behind him, and one of your warriors stands close enough to discourage any attempt to test the knots.</b></p>
<p><b>He looks you over for several moments before recognition settles across his face.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“I know you. $user. You're the chieftain who caught Kavonok's interest.”</span></div><p><b>His eyes move briefly toward the ruined site before returning to you.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“So what is this supposed to be? Revenge? Some misguided attempt to weaken the Chieftain? Or is this one of those short-sighted, opportunistic attacks you tribes are so prone to?”</span></div><p><b>There is open disdain in his voice when he offers the final possibility, the sort Mishan seems to reserve for the scattered peoples beyond its walls. Beneath it, however, you catch something else.</b></p>
<p><b>Fear.</b></p>
<p><b>He hides it well, but of the possibilities he listed, that is clearly the one he likes least. Revenge or strategy at least suggest some reason to keep him alive. If this was merely an opportunity to strike at Mishan and take whatever could be taken, there may be little reason not to leave him beside his escort when you are finished.</b></p>
<p><b>He shifts slightly against his bindings.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“It hardly matters. You have me. For the moment.”</span></div><p><b>He clearly has no desire to die here.</b></p>
<p><b>That does not mean he is eager to betray Mishan to avoid it. Fear of Kavonok alone would make that dangerous, and after watching him work, you doubt fear is the only thing keeping him loyal. Whatever he thinks of the man ruling the city, Mishan itself appears to matter to him.</b></p>
<p><b>Still, a man who values his own life has something to bargain with.</b></p>
<p><b>You already know enough about Tayan's work to understand that removing him would inconvenience Mishan. A man trusted to inspect its outposts, redirect workers, and decide where its reach should spread almost certainly knows far more than what you learned by watching him.</b></p>
<p><b>The question is whether you need him alive long enough to hear it.</b></p></div><div class="hub-buttons"><<button "Kill Tayan immediately">><<run setup.tayan.resolveDisposition("kill")>><<goto "Quest_Tayan_Kill">><</button>><<button "Convince him to talk.">><<run setup.tayan.resolveInterrogation("normal")>><<goto "Quest_Tayan_Interrogation">><</button>><<if _a.sway>><<button "Use Sway. - 20 Belief">><<run setup.tayan.resolveInterrogation("sway")>><<goto "Quest_Tayan_Interrogation">><</button>><<else>><span class="macro-button disabled" @title="_a.reason">Use Sway. - 20 Belief</span><</if>></div><div class="hub-textbox"><p><b>Your people have the site under control by the time Tayan is brought to you.</b></p>
<p><b>The struggle around the clearing is dying down. Some of your warriors move between the shelters and pits, securing anything useful and making certain nobody slips away unnoticed, while others deal with what remains of the escort and the workers who were still close enough to become a problem.</b></p>
<p><b>You do not need to give every order yourself. The important part is already understood.</b></p>
<p><b>No loose ends.</b></p>
<p><b>By the time the noise finally fades, the fledgling outpost has effectively ceased to exist. Tools lie abandoned beside the pits, half-built shelters stand empty, and whatever Mishan intended to establish here will not survive the day.</b></p>
<p><b>Tayan does.</b></p>
<p><b>His hands are bound behind him. Dust and blood mark one side of his face, though most of it does not appear to be his. Whatever composure he carried while giving orders earlier has been tested badly enough to show around the edges, but it has not broken.</b></p>
<p><b>He looks past you once toward the clearing behind your people and seems to understand exactly what is happening there.</b></p>
<p><b>Then his attention returns to you.</b></p>
<p><b>You have Kavonok's man alive.</b></p>
<p><b>What happens to him next is your decision.</b></p></div><div class="hub-buttons"><<button "Continue" "Quest_Tayan_Captive">><</button>></div><<silently>><<set _r = setup.tayan.getRun()>><<set _c = _r ? _r.captureResult : null>><<set _rows = setup.tayan.getResultRows()>><</silently>>
<div class="hub-textbox"><<if not _c>><p><b>The capture can no longer be resolved.</b></p><<else>>
<<if _c.check>><div class="result-list result-list-check"><div class="result-line result-line-check-outcome <<if _c.check.success>>is-pass<<else>>is-fail<</if>>"><span class="label"><<print _c.approach is "leadership" ? "Leadership Check" : "Strength Check">></span><span class="value"><<if _c.check.success>>PASSED<<else>>FAILED<</if>></span></div><div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _c.check.roll>></span></div><div class="result-line"><span class="label">Stat + d20 vs DC</span><span class="value"><<print _c.check.total>> / <<print _c.check.dc>></span></div></div><</if>>
<<if _c.approach is "leadership">><<if _c.captured>><p><b>You spend a little longer studying the clearing before giving the orders.</b></p>
<p><b>Two of your warriors are sent wide around the ridge, while another pair are told to show themselves briefly from the opposite side of the site and retreat noisily enough to draw attention. The rest remain hidden with you, waiting for the escort to stretch itself thin.</b></p>
<p><b>The important part is timing. If the first group reveals itself too early, Tayan will still have enough men around him to withdraw. Too late, and the escort may realize there is nothing beyond the ridge worth pursuing.</b></p>
<p><b>You wait until the workers have begun moving again and several of the Mishan guards are looking elsewhere.</b></p>
<p><b>Then you signal.</b></p>
<p><b>One of your warriors appears between the trees and vanishes again almost immediately, crashing through the brush exactly as instructed. A Mishan guard notices and calls out. Moments later, another of your people shows himself farther along the ridge.</b></p>
<p><b>Now the escort has two directions to worry about.</b></p>
<p><b>You let them hesitate.</b></p>
<p><b>Two Mishan warriors peel away first. A third follows after a brief exchange, moving toward the workers to keep them from scattering.</b></p>
<p><b>Only when the distance between them has grown wide enough do you give the second signal.</b></p>
<p><b>Your people come out of cover from three sides at once.</b></p>
<p><b>The remaining guards react quickly, but the clearing is already working against them. One turns toward the ridge before realizing the real attack has come from behind, while another tries to close around Tayan and instead finds two of your warriors cutting across his path.</b></p>
<p><b>By the time the men you drew away understand what happened, the center of the escort has already collapsed.</b></p>
<p><b>Tayan is seized before he can reach the edge of the clearing.</b></p>
<p><b>Your plan worked exactly as intended.</b></p><<else>><p><b>You divide your people and give the orders much as you planned: two warriors circle toward the ridge, another pair prepare to show themselves from the opposite side, and the rest remain hidden with you until the escort begins to spread out.</b></p>
<p><b>The mistake comes in the timing.</b></p>
<p><b>You send the first pair forward before the others are fully in position.</b></p>
<p><b>One of them breaks cover a moment too soon.</b></p>
<p><b>A Mishan warrior notices the movement, but instead of chasing it, he stops and scans the rest of the tree line. His attention shifts toward the ridge, then back toward the clearing.</b></p>
<p><b>He understands what he is looking at.</b></p>
<p><b>A warning shout goes up before your second group has even moved.</b></p>
<p><b>The escort closes around Tayan instead of spreading outward. Workers are pulled back from the edges of the site, and two warriors take position to cover the route out rather than chase the bait you offered them.</b></p>
<p><b>You order your people forward anyway, hoping to rescue the plan before it collapses completely, but the opportunity is already gone.</b></p>
<p><b>A spear thrown from the trees forces one Mishan warrior to duck, while another answers with one of his own and buys enough time for Tayan to be hurried toward the rough ground beyond the clearing.</b></p>
<p><b>Your people pursue, but now the terrain favors the retreating group. Every rise gives them another chance to turn, every patch of woodland another place to slow whoever follows.</b></p>
<p><b>You continue for a time before it becomes clear that chasing farther would only turn one mistake into several.</b></p>
<p><b>Tayan disappears into the country with his escort.</b></p>
<p><b>The opportunity is gone.</b></p><</if>>
<<elseif _c.approach is "strength">><<if _c.check.success>><p><b>You wait until Tayan's escort spreads just enough to leave a narrow opening between him and the nearest guards.</b></p>
<p><b>Then you move.</b></p>
<p><b>The first warrior barely has time to turn before you hit him with enough force to lift him from his feet. He crashes backward into one of the baskets beneath the awning, and something in his chest gives beneath the impact.</b></p>
<p><b>Another Mishan lunges from the side with his spear already leveled.</b></p>
<p><b>You catch the shaft in one hand.</b></p>
<p><b>For a heartbeat, he tries to wrench it free.</b></p>
<p><b>Then you pull him toward you.</b></p>
<p><b>Your other hand closes around his throat, and with a sharp twist his resistance vanishes. His body drops before the spear has even fully left his grip.</b></p>
<p><b>The clearing erupts around you.</b></p>
<p><b>A third warrior charges from near the pits. You knock the point of his spear aside and drive your shoulder into him with enough force to fold him backward over the edge of a timber stack. Bone cracks under the impact.</b></p>
<p><b>Your people are moving now, following through the gap you tore open.</b></p>
<p><b>One of the remaining guards grabs Tayan and tries to drag him toward the trees.</b></p>
<p><b>You reach them first.</b></p>
<p><b>The man turns just in time to see you coming.</b></p>
<p><b>Your fist catches him across the side of the head and snaps his neck sideways before he can bring his weapon up.</b></p>
<p><b>He drops.</b></p>
<p><b>Tayan does not get another step.</b></p>
<p><b>By the time the rest of the escort understands that the center of their formation has been broken apart, your hand is already locked around the man they were meant to protect.</b></p><<else>><p><b>You rush the opening before the escort can settle.</b></p>
<p><b>The first warrior goes down beneath the force of your charge, but the second gets his spear into position before you can reach Tayan. You knock the point aside and keep moving, yet those few lost heartbeats are enough for the others to close ranks.</b></p>
<p><b>What should have been a sudden seizure becomes a fight.</b></p>
<p><b>A spear catches you across the side. Another glances from your shoulder. Neither wound is enough to stop you, but both cost you time, and time is exactly what the escort needed.</b></p>
<p><b>Your warriors rush into the clearing behind you as the clash spreads.</b></p>
<p><b>At the far edge of the site, two Mishan have already started pulling Tayan toward the trees.</b></p>
<p><b>You force your way after them.</b></p><div class="result-list result-list-check"><div class="result-line result-line-check-outcome <<if _c.enduranceCheck.success>>is-pass<<else>>is-fail<</if>>"><span class="label">Endurance Check</span><span class="value"><<if _c.enduranceCheck.success>>PASSED<<else>>FAILED<</if>></span></div><div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _c.enduranceCheck.roll>></span></div><div class="result-line"><span class="label">Endurance + d20 vs DC</span><span class="value"><<print _c.enduranceCheck.total>> / <<print _c.enduranceCheck.dc>></span></div></div><<if _c.enduranceCheck.success>><p><b>You keep moving despite the pain.</b></p>
<p><b>Another spear scrapes across your ribs, but you barely slow. One of the guards turns to stop you and is driven into the ground before he can set his feet.</b></p>
<p><b>Behind you, the rest of the fight has become costly.</b></p>
<p><b>One of your warriors falls near the baskets.</b></p>
<p><b>Another goes down moments later beneath a Mishan spear.</b></p>
<p><b>You continue forward anyway.</b></p>
<p><b>Tayan is almost at the trees when you catch the warrior dragging him away, seize him by the back of the neck, and wrench him aside hard enough that he strikes the ground badly and does not rise.</b></p>
<p><b>Then your hand closes around Tayan's shoulder.</b></p>
<p><b>Once the escort realizes the man they were supposed to protect is already in your grasp, their resistance begins to collapse. Your people press the advantage, taking control of the clearing and dealing with what remains of the Mishan around the site.</b></p>
<p><b>By the time the fighting finally quiets, Tayan is yours.</b></p>
<p><b>Two of your warriors are dead.</b></p><<else>><p><b>You keep pushing forward, forcing one warrior aside and striking another down before he can block your path.</b></p>
<p><b>For a little while, sheer strength is enough.</b></p>
<p><b>Then your body begins demanding attention.</b></p>
<p><b>The wound along your side burns with every movement, and the next spear thrust forces you to turn instead of advancing. By the time you recover, Tayan is farther away.</b></p>
<p><b>Your people are still fighting behind you.</b></p>
<p><b>One of them falls.</b></p>
<p><b>Then another.</b></p>
<p><b>You try to force yourself forward again, but the escort has reached the rough ground beyond the clearing and is using it well. Chasing them now would mean leaving the rest of your warriors behind while pursuing an enemy that knows exactly where you are.</b></p>
<p><b>You stop.</b></p>
<p><b>The remaining Mishan withdraw soon afterward, leaving the site in chaos.</b></p>
<p><b>When the clearing finally quiets, Tayan is gone.</b></p>
<p><b>Two of your warriors are dead.</b></p><</if>><</if>>
<<elseif _c.approach is "wildling">><p><b><<print $wildlingName>> spends a little longer studying the narrow path and the uneven ground around it before giving you her plan.</b></p>
<p><b>She sends two of your warriors around the far side of the clearing, another farther down the route the Mishan used to arrive, and keeps the rest among the brush beside a narrow stretch where the ground dips sharply on one side.</b></p>
<p><b>Her instructions are simple.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“We make them leave this way.”</span></div><p><b>You glance toward the clearing.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">You</span><span class="dialogue-line">“And then?”</span></div><p><b>She gives you a small smile.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Then they find us.”</span></div><p><b>It works almost exactly as she intended.</b></p>
<p><b>A commotion begins on the far side of the site when one of your warriors allows himself to be seen and retreats. Another appears from a different direction moments later.</b></p>
<p><b>The Mishan react quickly, but in the way <<print $wildlingName>> expected.</b></p>
<p><b>Workers scatter. The escort closes around Tayan and begins moving him toward the narrow path rather than leaving him exposed in the clearing.</b></p>
<p><b>Straight toward the trap.</b></p>
<p><b>The first warrior reaches the dip and crashes through brush laid loosely across the ground. It is not deep enough to kill him, but it sends him down hard and tangles the man behind him.</b></p>
<p><b>Farther ahead, a weighted branch swings across the path and forces another pair of Mishan backward just as your warriors rise from cover on both sides.</b></p>
<p><b>The escort loses its shape almost immediately.</b></p>
<p><b>That is all the trap needed to do.</b></p>
<p><b>Your people close in while the Mishan are still trying to understand where the next threat is coming from. <<print $wildlingName>> moves with them, already cutting off the clearest route out.</b></p>
<p><b>By the time Tayan realizes the path ahead has been deliberately turned against him, there is nowhere left to go.</b></p>
<p><b>He is taken alive while your people continue through the site, securing the clearing and dealing with the rest of the Mishan before anyone can slip away and carry word back.</b></p><<elseif _c.approach is "spark">><p><b>There are subtler ways to do this.</b></p>
<p><b>You decide not to use one.</b></p>
<p><b>You wait until most of the escort has drifted back toward Tayan, close enough that each man could reach him within a few strides.</b></p>
<p><b>Then you call on Spark.</b></p>
<p><b>White flame blossoms in the clearing and immediately divides.</b></p>
<p><b>Several Mishan warriors recoil before the smaller flames have even reached them. One swings his spear through a burning shape and scatters it for a heartbeat, only for the fire to gather again along the shaft.</b></p>
<p><b>Another tears at a burning hide covering and manages only to spread the flame across his own hands.</b></p>
<p><b>Within moments, the escort's discipline is gone.</b></p>
<p><b>Men drop weapons, beat at their clothes, throw themselves into the dirt, or stumble blindly away from the white fire clinging to them.</b></p>
<p><b>Your warriors move into the opening almost immediately.</b></p>
<p><b>They do not need the flames to kill everyone.</b></p>
<p><b>They only need the escort unable to protect Tayan.</b></p>
<p><b>A Mishan warrior tries to pull him toward the trees and is cut off before he can make more than a few steps. Another turns back to help, but by then your people are already between them.</b></p>
<p><b>Tayan is restrained while the last of the white fire begins to fade.</b></p>
<p><b>Behind him, your warriors spread through the fledgling outpost, securing the site and making certain no one who might carry a clean account of what happened gets away in the confusion.</b></p>
<p><b>When Mishan eventually finds what remains here, there will be little doubt about who was responsible.</b></p><</if>>
<<if _c.failed>><div class="result-list"><<for _row range _rows>><div @class="'result-line ' + _row.className"><span class="label"><<print _row.label>></span><span class="value"><<print _row.value>></span></div><</for>></div><</if>><</if>></div>
<div class="hub-buttons"><<if _c and _c.captured>><<button "Continue" "Quest_Tayan_Capture">><</button>><<else>><<button "Return to Camp" "Hub_1">><</button>><</if>></div><<silently>><<set _r = setup.tayan.getRun()>><<set _rows = setup.tayan.getResultRows()>><</silently>><div class="hub-textbox"><<if _r and _r.disposition is "kill">><p><b>By the time you finally leave the site behind, there is little left to suggest what Mishan intended to build there.</b></p>
<p><b>The workers are gone, the pits stand abandoned, and anything worth carrying has been taken or scattered. The man who once decided where Kavonok's next foothold should rise will never make another inspection.</b></p>
<p><b>Mishan will recover from the loss eventually.</b></p>
<p><b>Replacing what you destroyed here will still take time.</b></p>
<p><b>For now, that is enough.</b></p><<elseif _r and _r.disposition is "spare">><p><b>You leave the ruined site not long after Tayan disappears into the surrounding country.</b></p>
<p><b>Mishan has lost the outpost before it ever truly became one, and you return with a better understanding of how Kavonok is extending his reach beyond the city walls, while Tayan returns home carrying a story that will hopefully allow him to live long enough to see another day.</b></p>
<p><b>Whether Kavonok believes it is no longer your problem.</b></p>
<p><b>For now, the bargain was kept, and the information you gained remains yours.</b></p><</if>><div class="result-list"><<for _row range _rows>><div @class="'result-line ' + _row.className"><span class="label"><<print _row.label>></span><span class="value"><<print _row.value>></span></div><</for>></div></div><div class="hub-buttons"><<button "Return to Camp" "Hub_1">><</button>></div><<silently>><<set _exp = setup.tayan.enterExpedition()>><<set _available = setup.tayan.getApproachAvailability()>><</silently>>
<div class="hub-textbox">
<<if _exp.ok>><p><b>The trail is not difficult to recover.</b></p>
<p><b>Six armed Mishan leave enough signs behind for your people to follow without pressing close. Broken stems, scuffed earth, the occasional footprint where the ground turns soft. The harder part is remaining far enough back that none of them realizes they are being followed.</b></p>
<p><b>You manage.</b></p>
<p><b>The group does not take one of the established roads. Instead, they cut through rougher country, moving between stretches of woodland and broken ground where few people have reason to travel.</b></p>
<p><b>By late morning, their tracks begin to mingle with others: fresh prints crossing back and forth over the same patch of ground, drag marks where timber has been hauled, and shallow cuts in the earth where people have already begun testing the soil and stone.</b></p>
<p><b>You slow the group behind you and move closer.</b></p>
<p><b>What you find is not quite an outpost. Not yet.</b></p>
<p><b>Several rough shelters have been thrown together beneath the trees, with stacks of fresh-cut timber nearby and baskets gathered beneath hide coverings. Farther downslope, workers dig into the earth and break apart exposed stone, while others sort what has already been pulled free.</b></p>
<p><b>The place looks temporary, but not accidental. Paths are beginning to form between the shelters and the pits, supplies have been gathered beneath crude coverings, and enough timber has already been cut to suggest that someone expected the site to become more than this.</b></p>
<p><b>The man you followed from Mishan walks through it without hesitation. People move aside for him as he passes, and one of the local overseers hurries forward to meet him.</b></p>
<p><b>He gestures toward several baskets waiting beneath a hide awning.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Site Overseer</span><span class="dialogue-line">“This is what we found.”</span></div><p><b>The guarded man crouches beside the first basket and begins sorting through its contents. Most of the stone is poor. The second holds a little worked antler and bone. The third is barely better than the first.</b></p>
<p><b>He turns one piece over in his hand before setting it back down.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Mishan Official</span><span class="dialogue-line">“Again?”</span></div><p><b>The overseer hesitates.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Site Overseer</span><span class="dialogue-line">“The ground is poor. We dug deeper like you ordered. There is more stone farther down, but little of it is worth carrying back.”</span></div><p><b>The official looks toward the pits, then toward the ridge beyond them.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Mishan Official</span><span class="dialogue-line">“You told me that on my last visit.”</span></div><p><b>The overseer lowers his eyes.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Mishan Official</span><span class="dialogue-line">“I told you to test the ridge, then the ground east of it. I told you not to spend another season pulling worthless stone from the same holes.”</span></div><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Site Overseer</span><span class="dialogue-line">“We needed more hands.”</span></div><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Mishan Official</span><span class="dialogue-line">“You had enough.”</span></div><p><b>The answer is immediate and completely flat.</b></p>
<p><b>The overseer looks toward the warriors behind him, and whatever argument he meant to make seems to die before it reaches his mouth.</b></p>
<p><b>The official rises and brushes the dust from his hands.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Mishan Official</span><span class="dialogue-line">“One finger. Left hand.”</span></div><p><b>One of the warriors smiles.</b></p>
<p><b>The overseer goes pale.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Site Overseer</span><span class="dialogue-line">“Please, Tayan. I can fix it. Give me another day.”</span></div><p><b>So that is his name.</b></p>
<p><b>Tayan studies the man for a moment. There is no anger in his expression, but no sympathy either.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You had more than a day.”</span></div><p><b>He turns toward another worker.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You take charge here. Move half the workers to the ridge before sunset. The rest test the ground east tomorrow. If both fail, abandon the site and report back.”</span></div><p><b>Behind him, two warriors seize the overseer and force his hand against a length of timber.</b></p>
<p><b>The one who smiled draws a stone blade. He takes his time placing it against the man's hand, enjoying the moment far more than Tayan appears to.</b></p>
<p><b>Tayan does not watch. By the time the blade comes down, he is already speaking to the new overseer.</b></p>
<p><b>A scream tears across the clearing.</b></p>
<p><b>Several of the workers flinch.</b></p>
<p><b>Tayan pauses only long enough for the sound to pass.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“The ridge first.”</span></div><p><b>The former overseer is released a moment later. He falls to his knees, clutching his bleeding hand against his chest while the smiling warrior wipes the blade clean.</b></p>
<p><b>Tayan continues giving instructions.</b></p>
<p><b>You remain where you are, watching and listening as the purpose of the place slowly becomes clearer.</b></p>
<p><b>This man is not here to gather stone himself. He decides where others will gather it, inspects what they find, replaces the people who fail, and sends workers toward the next hill, riverbank, or stretch of ground that might give Mishan something worth carrying home.</b></p>
<p><b>The site itself is hardly more than cut timber, shallow pits, and a few temporary shelters. Given enough time, perhaps it would become something more permanent: another Mishan foothold beyond the walls, feeding resources back toward Kavonok.</b></p>
<p><b>It does not look as though this one will.</b></p>
<p><b>The workers are already being redirected, and Tayan has begun discussing what should be moved if the ridge proves worthless as well.</b></p>
<p><b>One of your warriors leans closer.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Warrior</span><span class="dialogue-line">“He chooses where they spread.”</span></div><p><b>That appears to be exactly what he does.</b></p>
<p><b>And Kavonok has sent six armed men to make certain he continues doing it.</b></p>
<p><b>You continue watching for a while longer.</b></p>
<p><b>The pattern of the escort becomes clearer with every passing moment. Tayan rarely leaves the center of the site, but the warriors around him do not remain packed tightly together. Two repeatedly move toward the ridge to check on workers. Another circles the edge of the clearing. The rest stay close, though their attention shifts whenever someone approaches with a report or another order needs carrying out.</b></p>
<p><b>There are openings. Not easy ones, but real ones.</b></p>
<p><b>With careful coordination, your people might be able to draw part of the escort away and close on Tayan before the others understand what is happening.</b></p>
<p><b>You could also trust your own strength and move faster than they can react. It would be riskier, and if you misjudge the moment the whole clearing could turn into a fight, but you might still be able to force your way through before they can escape.</b></p><<if _available.wildling>><p><b>Beside you, <<print $wildlingName>> has spent more time studying the ground than the men. Her eyes keep moving between the slope, the thick brush around the clearing, and the narrow path the Mishan used to enter.</b></p>
<p><b>Eventually she leans closer.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Could trap them here.”</span></div><p><b>She points toward the path, then toward a patch of dense growth overlooking it.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Make them come where we want.”</span></div><p><b>Judging by the small smile that follows, she already has something in mind.</b></p><</if>><<if _available.spark>><p><b>There is also the less subtle answer.</b></p>
<p><b>The escort spends enough time close together that a burst of white flame would throw the entire group into confusion before any of them understood what was happening. They may know stories of what you can do by now, but knowing that such a thing exists is not the same as being ready when it suddenly comes for you.</b></p><</if>><p><b>Tayan has already begun preparing to move on. Once he leaves this site with the escort around him, whatever opportunity you have here goes with him.</b></p>
<p><b>You have enough time to choose how you want to take him.</b></p><<else>><p><b><<print _exp.reason>></b></p><</if>></div>
<div class="hub-buttons"><<if _exp.ok>>
<<button "Draw part of the escort away.">><<run setup.tayan.resolveCapture("leadership")>><<goto "Quest_Tayan_CaptureResult">><</button>>
<<button "Take him before they can react.">><<run setup.tayan.resolveCapture("strength")>><<goto "Quest_Tayan_CaptureResult">><</button>>
<<if _available.wildling>><<button "Let <<print $wildlingName>> prepare an ambush.">><<run setup.tayan.resolveCapture("wildling")>><<goto "Quest_Tayan_CaptureResult">><</button>><</if>>
<<if _available.spark>><<button "Use Spark to break the escort. - 15 Belief">><<run setup.tayan.resolveCapture("spark")>><<goto "Quest_Tayan_CaptureResult">><</button>><<else>><span class="macro-button disabled" @title="_available.sparkReason">Use Spark to break the escort. - 15 Belief</span><</if>>
<<else>><<button "Return to Camp" "Hub_1">><</button>><</if>></div><<silently>><<set _r = setup.tayan.getRun()>><<set _i = _r ? _r.interrogation : null>><</silently>><div class="hub-textbox"><<if _i>><div class="result-list result-list-check"><div class="result-line result-line-check-outcome <<if _i.success>>is-pass<<else>>is-fail<</if>>"><span class="label">Charisma Check</span><span class="value"><<if _i.success>>PASSED<<else>>FAILED<</if>></span></div><div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _i.check.roll>></span></div><div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _i.check.total>> / <<print _i.check.dc>></span></div></div><<if _i.kind is "sway">><p><b>You decide that Tayan's caution deserves something more than ordinary persuasion.</b></p>
<p><b>You still begin with words.</b></p>
<p><b>Kavonok is not Mishan.</b></p>
<p><b>Whatever loyalty Tayan feels toward his city does not mean he owes the same loyalty to the man ruling it, particularly a man willing to mutilate Mishan's own people for disappointing him and discard them the moment someone more useful can take their place.</b></p>
<p><b>Tayan's eyes narrow.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You think I do not know what sort of man Kavonok is?”</span></div><p><b>You tell him that is exactly your point.</b></p>
<p><b>Sway moves with the words as you continue.</b></p>
<p><b>There is no gesture to announce it and nothing visible passing between you. The influence leaves with your voice, subtle as a current carried through every sentence, making each argument a little easier to accept than it should be.</b></p>
<p><b>You ask why Tayan should die here merely to keep Kavonok from losing information.</b></p>
<p><b>His reply comes more slowly than before.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Because if I tell you and return...”</span></div><p><b>He hesitates.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Kavonok will kill me anyway.”</span></div><p><b>You tell him he does not need to return as a traitor.</b></p>
<p><b>The outpost was already failing. Its overseer had ignored orders, wasted labor, and forced Tayan to intervene. The man resisted punishment. His workers followed him. Fighting broke out, the escort died restoring order, and by the time it ended there was nothing left at the site worth preserving.</b></p>
<p><b>As you explain the story, the power continues to travel with your voice.</b></p>
<p><b>Each objection Tayan raises takes a little longer to form. Each part of the explanation seems more reasonable once he has heard it aloud.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“The overseer had already ignored an order.”</span></div><p><b>You agree.</b></p>
<p><b>The site was producing almost nothing.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“It was.”</span></div><p><b>The people capable of contradicting his version of events will not be returning to Mishan.</b></p>
<p><b>Tayan's gaze drifts toward the ruined site.</b></p>
<p><b>You make the same promise you would have made without the power.</b></p>
<p><b>Give you useful information, and you will let him leave alive.</b></p>
<p><b>The words settle heavily.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You would let me go...”</span></div><p><b>You confirm it.</b></p>
<p><b>He remains silent for several moments, working through the argument with noticeably more effort than before.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“I... yes. I see what you mean.”</span></div><p><b>His will has not disappeared, nor has his loyalty to Mishan.</b></p>
<p><b>You have simply made the path you offered him far easier to believe.</b></p><<if _i.success>><p><b>Once Tayan begins answering, there is still hesitation in his voice, but it no longer stops him.</b></p>
<p><b>You ask where Kavonok intends to establish new sites, and he gives you an actual location rather than a vague direction. When you ask which outposts matter most, he tells you which ones Mishan would notice losing immediately and which could disappear without seriously affecting the city.</b></p>
<p><b>From there, you move through everything he is willing to give you: routes used to move resources, places where workers are being concentrated, prospective sites that Kavonok expects to become valuable, and parts of Mishan's reach that are thinner than they appear from the outside.</b></p>
<p><b>Every so often Tayan pauses, seeming to realize how much he has already said, but the bargain you constructed still feels reasonable enough that the conversation continues.</b></p>
<p><b>By the time the questioning ends, you have learned most of what you hoped to.</b></p>
<p><b>As the influence of Sway begins to fade, Tayan grows quieter.</b></p>
<p><b>He looks toward the ground, then back toward you, clearly remembering every answer he gave and understanding exactly how useful some of them may prove.</b></p>
<p><b>He says nothing about it.</b></p>
<p><b>The bargain, after all, was his life.</b></p><<else>><p><b>For a while, the argument appears to be working.</b></p>
<p><b>Tayan begins answering more freely than he would have otherwise. He gives you the location of one prospective site, identifies an established outpost Mishan considers worth protecting, and lets slip enough about one of the routes carrying resources toward the city to make the information useful.</b></p>
<p><b>Then something in him catches the change.</b></p>
<p><b>He goes quiet, brow furrowing as though trying to trace the path his own thoughts have taken over the last few moments. When you continue speaking, he gives a hard shake of his head, visibly forcing himself away from the comfortable certainty your words had been building.</b></p>
<p><b>When he looks back at you, the hesitation has hardened into anger.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“No more of your witchcraft. Try it again and I'll bite my own tongue off before I give you another word.”</span></div><p><b>The threat does not sound theatrical.</b></p>
<p><b>You believe him.</b></p>
<p><b>Whatever opening Sway created has closed, and forcing the matter further would risk leaving you with a captive incapable of telling you anything at all.</b></p>
<p><b>Still, the attempt was not wasted.</b></p>
<p><b>He gave you enough before recognizing the influence to expose one meaningful weakness in Mishan's growing reach.</b></p><</if>><<else>><p><b>You decide that simply threatening Tayan is unlikely to accomplish much.</b></p>
<p><b>He has already seen what happened to his escort. He knows you can kill him, and repeating the point would tell him nothing new. If you want him to willingly give up anything valuable, you need to make cooperation look safer than silence.</b></p>
<p><b>You begin with Kavonok.</b></p>
<p><b>Whatever loyalty Tayan feels toward Mishan, you point out that Kavonok is not Mishan itself. You have seen what his rule looks like firsthand. A Mishan overseer failed to meet expectations, and the response was to mutilate him without hesitation before immediately replacing him with someone else.</b></p>
<p><b>Tayan's expression hardens.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You think I need you to explain Kavonok to me?”</span></div><p><b>You do not.</b></p>
<p><b>That is precisely why the argument matters.</b></p>
<p><b>If Tayan dies here rather than give you anything, he is not dying for Mishan's walls, its people, or even its future. He is dying to protect Kavonok from losing a little information.</b></p>
<p><b>For a moment, he simply watches you.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“And if I give it to you?”</span></div><p><b>He glances toward the ruined site.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Then I return having lost an outpost, six men, and whatever secrets you decided were worth asking for.”</span></div><p><b>His mouth twists faintly.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“I still die for Kavonok. Only later, and because I was foolish enough to help you first.”</span></div><p><b>That is the real obstacle.</b></p>
<p><b>You need to convince him that helping you will not simply trade one death for another.</b></p>
<p><b>So you offer him a way out.</b></p>
<p><b>The site was already failing before you arrived. Its overseer had ignored earlier instructions, continued wasting labor on poor ground, and forced Tayan to intervene personally. There are now very few people left who could contradict whatever account he chooses to give once he reaches Mishan.</b></p>
<p><b>He does not have to return as a captive who betrayed his city.</b></p>
<p><b>He can return as the only Mishan man who survived an outpost that turned against him.</b></p>
<p><b>The overseer refused his punishment. The workers sided with him. The attempt to restore order became violent, and Tayan's escort died putting the rebellion down. By the time the fighting ended, the site was ruined and the surviving workers had scattered into the countryside.</b></p>
<p><b>It would still be an ugly report.</b></p>
<p><b>But it would be a believable one.</b></p>
<p><b>More importantly, it would turn an obvious personal failure into something he could plausibly claim to have survived and contained.</b></p>
<p><b>Then you make the bargain explicit.</b></p>
<p><b>If Tayan gives you information that is genuinely useful, you will let him leave alive.</b></p>
<p><b>You give him your word.</b></p>
<p><b>That gets his full attention.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Your word?”</span></div><p><b>You confirm it.</b></p>
<p><b>Now all that remains is whether he believes the bargain is worth taking.</b></p><<if _i.success>><p><b>Tayan takes his time considering the offer.</b></p>
<p><b>His attention moves across the remnants of the outpost, and you can almost see him testing the story against what Kavonok will eventually know. The site was already poor. The overseer had already failed once. The people most capable of contradicting him will not be returning to Mishan with a different account.</b></p>
<p><b>Eventually, his eyes return to you.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“If I answer you, I walk away from here.”</span></div><p><b>You remind him that you already gave your word.</b></p>
<p><b>He exhales slowly through his nose.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Then ask.”</span></div><p><b>You begin with where Kavonok intends to expand next.</b></p>
<p><b>The first answers come cautiously. Tayan names stretches of country Mishan has already examined, then explains which ones showed enough promise to justify sending workers after them.</b></p>
<p><b>Once he has crossed that first line, the rest becomes easier.</b></p>
<p><b>He tells you which existing outposts matter enough that Kavonok would notice their loss immediately, which are barely returning enough to justify themselves, and which routes carry their yields back toward Mishan. He explains where new sites are likely to appear and which parts of Mishan's growing reach are being maintained more by reputation than actual strength.</b></p>
<p><b>He does not tell you everything.</b></p>
<p><b>You never expected him to.</b></p>
<p><b>What he gives you is enough to make Mishan's network beyond the city considerably less mysterious than it was before.</b></p><<else>><p><b>Tayan listens to the entire proposal without interrupting.</b></p>
<p><b>The possibility clearly interests him. His attention keeps returning to the ruined site whenever you describe the story he could carry home, and the promise of being allowed to leave is not something he dismisses lightly.</b></p>
<p><b>But interest is not the same as trust.</b></p>
<p><b>When you finish, he gives you a long, assessing look.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You expect me to gamble my life on your word and a story Kavonok may tear apart the moment I return?”</span></div><p><b>You argue that the alternative is hardly safer.</b></p>
<p><b>That much he seems to accept.</b></p>
<p><b>What you fail to do is convince him that your offer is safe enough to justify handing over anything Mishan would truly care about.</b></p>
<p><b>When you begin questioning him, he answers, but cautiously.</b></p>
<p><b>He tells you where Mishan generally prefers to search for new sites, which kinds of ground have proved more useful in the past, and enough about its outposts to confirm a few patterns you had already begun to suspect. Some of it is genuinely useful, and you leave the conversation understanding Mishan a little better than you did before.</b></p>
<p><b>He simply refuses to cross the line into anything important.</b></p>
<p><b>When you ask for specific locations, valuable outposts, or weaknesses in the routes feeding resources back toward Mishan, his expression closes.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“That is as far as I go.”</span></div><p><b>You have learned something.</b></p>
<p><b>Just not enough to meaningfully change the shape of the campaign.</b></p><</if>><</if>><<else>><p><b>The questioning can no longer be resolved.</b></p><</if>></div><div class="hub-buttons"><<if _i>><<button "Keep Your Word">><<run setup.tayan.resolveDisposition("spare")>><<goto "Quest_Tayan_Spare">><</button>><<button "Kill Him Anyway">><<run setup.tayan.resolveDisposition("kill")>><<goto "Quest_Tayan_Kill">><</button>><<else>><<button "Return to Camp" "Hub_1">><</button>><</if>></div><<silently>><<set _r = setup.tayan.getRun()>><</silently>><div class="hub-textbox"><<if _r and _r.interrogation>><p><b>Tayan has given you what you asked for.</b></p>
<p><b>More importantly, you gave him something in return.</b></p>
<p><b>Your word.</b></p>
<p><b>When you call the nearby warriors over, he initially seems to assume they are there to cut his bindings.</b></p>
<p><b>Then he notices the way they position themselves.</b></p>
<p><b>His attention snaps back toward you.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“...No.”</span></div><p><b>You give the order.</b></p>
<p><b>For the first time since his capture, the careful restraint in his expression gives way completely.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You gave me your word.”</span></div><p><b>You did.</b></p>
<p><b>That does not change what happens next.</b></p>
<p><b>Disbelief lingers on his face for a moment before hardening into disgust.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Of course. I should have expected nothing more from you tribals.”</span></div><p><b>There is little point answering.</b></p>
<p><b>Your warriors take him back toward the ruined outpost. He does not beg as they lead him away, whether out of pride, hatred, or a simple refusal to give you anything else.</b></p>
<p><b>The execution is quick.</b></p>
<p><b>Once he is dead, his head is severed and carried into the center of the site, where it is placed prominently among the remains for Mishan to find.</b></p>
<p><b>The information he gave you remains useful.</b></p>
<p><b>He does not.</b></p>
<p><b>When Mishan eventually comes looking for what happened here, they will find the ruined outpost, the bodies left behind, and the head of the man Kavonok trusted to extend his reach waiting in the middle of it all.</b></p>
<p><b>They will understand the message.</b></p><<else>><p><b>You have already learned enough about Tayan to understand what his loss would mean for Mishan.</b></p>
<p><b>Whatever else he knows can remain his.</b></p>
<p><b>You give the order.</b></p>
<p><b>Tayan watches the warriors around him begin to move, and whatever uncertainty remained about your intentions disappears from his expression.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“So it was the third one after all.”</span></div><p><b>You know what he means.</b></p>
<p><b>No revenge. No careful attempt to pry something useful from him. From where he sits, this has become exactly the sort of opportunistic violence he accused the surrounding tribes of indulging in.</b></p>
<p><b>His mouth tightens with something close to contempt.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“Kavonok will replace me. Mishan has survived worse than you.”</span></div><p><b>Replacing him will still take time. Finding someone competent enough to do the work properly may take longer still.</b></p>
<p><b>Two of your warriors pull him to his feet and lead him back toward the ruined site. You do not bother following closely; by now, there is little left that requires your attention.</b></p>
<p><b>The work is swift.</b></p>
<p><b>When it is done, his head is severed from the body and carried into the center of the abandoned outpost. Your people place it where anyone approaching the site will see it long before they find the rest of the dead.</b></p>
<p><b>There will be no confusion about the message.</b></p>
<p><b>Looking at the lifeless head, you find yourself returning to one thing he said.</b></p>
<p><b>Mishan has survived worse than you.</b></p>
<p><b>Maybe that is what they believe.</b></p>
<p><b>Mishan has never had the misfortune of meeting anything quite like you before.</b></p><</if>></div><div class="hub-buttons"><<button "Continue" "Quest_Tayan_Conclusion">><</button>></div><div class="hub-textbox"><p><b>You have what you asked for.</b></p>
<p><b>Now Tayan waits to discover whether your promise actually meant anything.</b></p>
<p><b>For a moment, nobody moves. Then you tell the warrior behind him to cut the bindings.</b></p>
<p><b>Tayan looks back as the cord falls away from his wrists and slowly rubs one hand over the other where the bindings bit into the skin.</b></p>
<p><b>He does not stand immediately.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“You're actually letting me leave.”</span></div><p><b>You gave him your word.</b></p>
<p><b>Apparently he had not been entirely certain that would be enough.</b></p>
<p><b>Eventually he rises.</b></p>
<p><b>His attention moves toward what remains of the outpost, and the problem waiting for him becomes real again. Mishan will expect an explanation for the lost site, the dead escort, and everyone else who failed to return.</b></p>
<p><b>Fortunately for him, you have already helped construct one.</b></p>
<p><b>The overseer refused his punishment. The workers followed him. Fighting consumed the site, the escort died restoring order, and by the time it was over there was nothing left worth preserving.</b></p>
<p><b>Whether Kavonok believes every part of it is another matter.</b></p>
<p><b>It is still far better than the truth.</b></p><div class="dialogue-inset"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“The overseer refused the punishment. His people turned on us. We put them down, but the site was lost.”</span></div><p><b>He repeats the core of the story aloud, testing the shape of it.</b></p>
<p><b>Then his eyes return to you.</b></p><div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Tayan</span><span class="dialogue-line">“I can work with that.”</span></div><p><b>There is no gratitude in his voice.</b></p>
<p><b>You destroyed his escort, ruined his work, and forced information from him before offering a way to survive the consequences. Gratitude would be asking a great deal.</b></p>
<p><b>Still, whatever else Tayan now thinks of you, he knows one thing with certainty.</b></p>
<p><b>You kept the bargain.</b></p>
<p><b>You let him leave alone.</b></p>
<p><b>He does not look back once he reaches the trees.</b></p>
<p><b>By the time Mishan learns what happened here, the only account returning from the site will be his.</b></p></div><div class="hub-buttons"><<button "Continue" "Quest_Tayan_Conclusion">><</button>></div><<silently>>
<<set _result = setup.tributeCollectors.finalizeBattle()>>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : (setup.stopBattle ? setup.stopBattle() : null)>>
<</silently>>
''<div class="hub-textbox">
<h2>Tribute Collectors</h2>
<<if _result.ok and _result.victory>>
<p>The Mishan line breaks.</p>
<p>Those still able to flee abandon what they were carrying and disappear into the surrounding country.</p>
<p>Your people do not pursue them far.</p>
<p>There is little reason to.</p>
<p>The bundles left behind are opened one after another.</p>
<p>A little food from one group. Worked hides from another. Stone, bone, tools, and small valuables gathered from people too scattered and insignificant for anyone else to take much notice of.</p>
<p>None of it would have been worth this fight alone.</p>
<p>Together, it is quite a haul.</p>
<p>And now it is yours.</p>
<<elseif _result.ok>>
<p>The attack loses its momentum.</p>
<p>The Mishan pull together around the tribute while your people begin giving ground.</p>
<p>Eventually you have no choice but to withdraw.</p>
<p>They do not follow far.</p>
<p>When your people are clear enough to look back, the collectors are already gathering the scattered bundles and preparing to move.</p>
<p>Whatever those little tribes paid them will reach Mishan after all.</p>
<<else>><p><<print setup.mishan.escapeHtml(_result.reason)>></p><</if>>
<<if _result.ok>><div class="result-list">
<div class="result-line <<if _result.victory>>good<<else>>bad<</if>>"><span class="label">Outcome</span><span class="value"><<print _result.title>></span></div>
<div class="result-line <<if _result.playerLoss > 0>>bad<</if>>"><span class="label">Your losses</span><span class="value"><<print _result.playerLoss>> Population</span></div>
<<if _result.victory>>
<div class="result-line good"><span class="label">Food</span><span class="value">+<<print _result.foodGain>></span></div>
<div class="result-line good"><span class="label">Resources</span><span class="value">+<<print _result.resourceGain>></span></div>
<div class="result-line good"><span class="label">Goods</span><span class="value">+<<print _result.goodsGain>></span></div>
<div class="result-line good"><span class="label">Preparedness</span><span class="value">+<<print _result.preparednessDelta>></span></div>
<</if>>
<div class="result-line bad"><span class="label">Mishan Anger</span><span class="value">+<<print _result.angerDelta>></span></div>
</div><</if>>
</div>''
<div class="hub-buttons tribute-collectors-result-actions"><<button "<span class='choice-text'>Continue</span>" "Hub_1">><</button>></div><<silently>>
<<set _exp = setup.tributeCollectors.enterExpedition()>>
<<set _canBattle = setup.raidV1.getAvailableWarbandCount(Number($pops ?? 0)) > 0>>
<</silently>>
''<div class="hub-textbox">
<h2>Tribute Collectors</h2>
<<if _exp.ok>>
<p>You close in without being spotted.</p>
<p>At first, the Mishan group seems to be waiting for no obvious reason.</p>
<p>Then people begin appearing from the surrounding country.</p>
<p>Five or six at a time. Small bands living beyond the routes anyone pays much attention to, too scattered and insignificant for the larger tribes of the region to bother counting among their neighbours.</p>
<p>The first group speaks briefly with the Mishan before leaving behind a bundle of hides, dried food, and a few worked tools.</p>
<p>Later, another arrives.</p>
<p>Then another.</p>
<p>None of them brings very much.</p>
<p>Taken separately, the offerings would hardly seem worth the journey.</p>
<p>Taken together, however, the Mishan packs are beginning to look rather heavy.</p>
<p>It seems Kavonok's reach extends even to the little tribes scattered beyond everyone else's notice.</p>
<p>By the time the collectors prepare to leave, their modest tributes have become a respectable haul.</p>
<p>A shame to let them carry it home.</p>
<<else>><p><<print setup.mishan.escapeHtml(_exp.reason)>></p><</if>>
</div>''
<div class="hub-buttons">
<<if _exp.ok and _canBattle>><<button "<span class='choice-text'>Attack Them</span>">><<set _battle = setup.tributeCollectors.startBattle()>><<if _battle.ok>><<goto "Raid_V1_Battle">><</if>><</button>>
<<elseif _exp.ok>><span class="macro-button disabled" aria-disabled="true" title="Your tribe cannot field a warband."><span class="choice-text">Attack Them</span></span><</if>>
<<button "<span class='choice-text'>Return to Camp</span>" "Hub_1">><</button>>
</div><<set $energy = Math.max(0, Number($energy || 0) - 1)>>
''<div class="hub-textbox">
<<if _terrain is "mountains">>
The land tightens into stone and steep incline as you close in. Footing grows treacherous, with loose shale skittering downslope beneath every step.
Their trail is thin, but the mountains remember it: scraped rock, shattered stone, and a dark smear where blood met pale granite before running downhill. Whatever happened, they were driven upward.
Sound behaves strangely here. Voices echo where they should not, then vanish where they ought to carry. When you crest the ridge, a narrow shelf comes into view below.
Five hunters wait along the stone. Two stand forward with spears braced while the others hold the higher ground, watching for movement. They do not shout because they do not need to. Their people are pressed close behind them, thin and wary, sheltering against the rock in the belief that the height will protect them.
<<elseif _terrain is "forest">>
The forest closes ranks as you advance. Branches hang broken and underbrush lies crushed beneath hurried feet, leaving a trail marked by sharp turns and paths chosen for speed rather than sense. They knew they were being followed.
You hear them before you see them: low voices and short laughs from men who still think they have time. When you part the brush, five hunters form a loose line between the trees. Two step forward while the others angle outward, quietly closing off the easiest paths through the trunks.
Behind them, the rest of the tribe clusters together, silent and ready to scatter if the line breaks. They chose this ground carefully.
<<else>>
There is nowhere to hide here. The open land is broken just enough to slow a group on the move, and tracks converge from several directions where the strangers have already taken their positions.
Five hunters stand spaced wide with spears raised. Two speak in low tones while the others watch the flanks with practiced patience. Behind them, their people wait exposed and exhausted, with nowhere better left to run. They stopped because they had no better choice.
<</if>>
<<if $height < 160>>
The nearest hunter squints at you, lips tightening.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Hunter</span>
<span class="dialogue-line">Short.</span>
</div>
He mutters it almost to himself, then lets his gaze slip past you to the men behind. No one smiles; hands simply tighten around spear shafts.
<</if>>
The man at the front speaks at last.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">We don’t want trouble. We came for food.</span>
</div>
His words are familiar enough for your hunters to follow, though the rhythm is different, shaped by another land. He hesitates before continuing.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">We ran from the Unmoving, by the great lake.</span>
</div>
A murmur passes through his people.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">They don’t travel. They don’t trade. They don’t forget.</span>
</div>
His jaw tightens.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">They pushed us out. Claimed one of our hunters killed a deer that belonged to their chief.</span>
</div>
Then, more quietly, he mutters to himself.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">How does one own an animal in the forest?</span>
</div>
<<cgimg "images/expeditions/TutorialQuest/tutorial.png" "Amogus">>
He gestures toward the people behind him.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">We left and walked until our legs failed us. This was the only ground we had left.</span>
</div>
Slowly, he lowers his spear.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">We’ll give you what we have. Stone, tools, hides.</span>
</div>
After a brief pause, he adds the one condition that clearly matters to him.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Stranger</span>
<span class="dialogue-line">Just let us keep our food.</span>
</div>
Some of your hunters shift. A few watch the strangers with sympathy, seeing too much of their own past in the hollow eyes and thin frames. Others seem quietly pleased by the simple fact that, for once, your tribe is not the weakest group here. Most keep their reaction to themselves.
Whatever they think, the decision is yours. The strangers wait for your answer.
</div>''
<div class="hub-buttons">
<<button "Agree to his deal">>
<<set $tutorialOutcome = "deal">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
<<button "Attack and take everything">>
<<set $tutorialOutcome = "attack">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
<<button "Convince them to join your tribe">>
<<set $tutorialOutcome = "absorb">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
</div><<silently>>
/* Did the prior resolution increase pops?
- Attack success: gained pops
- Absorb success: gained pops
- Deal: no pops change
- Attack fail: lost pops
- Absorb fail: no pops gain (but zeal/stability hit)
*/
<<set _gainedPops =
(($tutorialOutcome is "attack" or $tutorialOutcome is "absorb")
and $questLastCheck and $questLastCheck.ok)
>>
/* Record completion so Kael's follow-up quest can key off it later. */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags["q_tutorial_end_complete"]>>
<<set $questFlags["q_tutorial_end_complete"] = true>>
<<set $questFlags["q_tutorial_end_completed_turn"] = Number($turn ?? State.variables.turn ?? 0)>>
<</if>>
<<startVictory_DominateRegion>>
<<run setup.prologue && setup.prologue.complete ? setup.prologue.complete() : null>>
<</silently>>
''<div class="hub-textbox">
Some time later, once the camp has settled after the day’s work and the new supplies have been counted, Kael finds you near the fire. He gives the camp a quick look before turning his attention back to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">So. It’s taken care of.</span>
</div>
<<if _gainedPops>>
His eyes move toward the edge of camp, where the new arrivals have gathered near the outer fires. They sit close enough to share the warmth, but not so close that your people have stopped watching them.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">They’ll need settling. I’ll see it done.</span>
</div>
He studies the men among them, taking in narrow shoulders, thin arms, and faces drawn tight by hunger.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Weak, but that’s starvation speaking. I see a few with a hunter’s eyes. If they make it through the first nights, they’ll learn.</span>
</div>
He pauses, then gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">And if they don’t...</span>
</div>
<<else>>
His gaze goes to the piles instead: bundles of hide, chipped stone, salvaged cord, and whatever else was worth carrying back.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Hm. I’ll have that sorted.</span>
</div>
He crouches, lifts one of the tools, and turns it over in his palm.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Good stone. Not fine work, but it’ll do.</span>
</div>
He sets it down carefully. Kael has never been the sort of man to waste something that might keep a child alive.
<</if>>
He straightens and looks back to you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">You dealt with them, $user, but they’ll only be the first.</span>
</div>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We should expect others sooner or later.</span>
</div>
His attention drifts beyond the ring of firelight and the spearpoints marking the edge of camp, toward whatever else is waiting in the dark.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">We’ll need to deal with them before one of them decides to deal with us.</span>
</div>
For a moment he is the familiar Kael again: practical, stone-faced, and already thinking about the next problem. Then the corner of his mouth lifts in a small smile.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Luckily, the strongest chieftain, blessed by the spirits, stands with us.</span>
</div>
His eyes stay on yours.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">So our victory is already all but assured.</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">A new home</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "Hub_1">>
<</button>>
</div><<silently>><<set _qid = "q_tutorial_migration_01">>
/* Choice comes from previous passage */
<<set _choice = $tutorialOutcome ?? "deal">>
/* Default: no check (deal always succeeds) */
<<set _doCheck = (_choice is "attack" or _choice is "absorb")>>
/* Easy DC – tutorial forgiving */
<<set _baseDC = 10>>
<<if _choice is "attack">>
<<set _baseDC = 9>>
<<elseif _choice is "absorb">>
<<set _baseDC = 9>>
<</if>>
/* Pick stat key only for checked choices */
<<set _statKey = (_choice is "attack") ? "strength" : "charisma">>
/* Roll only if needed */
<<set _roll = 0>>
<<set _stat = 0>>
<<set _total = 0>>
<<set _ok = true>>
<<if _doCheck>>
<<set _roll = random(1,20)>>
<<set _stat = setup.player.getStatForCheck(_statKey)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
<</if>>
/* Record */
<<set $questLastCheck = {
ok:_ok,
statKey: _doCheck ? _statKey : "none",
stat:_stat,
roll:_roll,
dc:_baseDC,
total:_total,
choice:_choice
}>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and ($quests[_i].id is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* complete quest (always completes; outcome may be clean or messy) */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>>
/* Aspect signs tied to the chosen approach (narrative -> aspect link) */
<<set _aspGainLabel = "">>
<<set _aspLossLabel = "">>
<<if _choice is "attack">>
<<run setup.aspects.addPoints("blood", 3, "Attack and take everything")>>
<<run setup.aspects.addPoints("hearth", -5, "Attack and take everything")>>
<<set _aspGainLabel = "+3 Blood">>
<<set _aspLossLabel = "-5 Life">>
<<elseif _choice is "absorb">>
<<run setup.aspects.addPoints("influence", 3, "Convince them to join")>>
<<run setup.aspects.addPoints("blood", -5, "Convince them to join")>>
<<set _aspGainLabel = "+3 Influence">>
<<set _aspLossLabel = "-5 Blood">>
<</if>><</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if _doCheck>>
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $questLastCheck.statKey>> + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<<else>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Resolved</span>
</div>
<</if>>
</div>
<<if _choice is "deal">>
You raise a hand slowly enough that neither side mistakes the movement for an attack. There is no need to hurry the decision; everyone here already understands who has the stronger position.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">Then pay.</span>
</div>
Their front-man swallows and looks back at his people once before nodding. They bring forward what little they can afford to lose: chipped stone blades wrapped in hide, a bundle of sinew cord, and tools worn smooth by long use.
Your hunters take the payment without ceremony. The food stays with the strangers.
Relief moves through their people in small, unmistakable ways. Knees loosen, shoulders drop, and one woman presses her face into a child’s hair before gathering herself again. They withdraw carefully, keeping their eyes on your hunters and their spears ready until there is enough distance between the two groups.
<<silently>>
/* DEAL REWARDS: nice amount of goods/resources */
<<set _dFood = 0>>
<<set _dRes = 10>>
<<set _dGoods = 3>>
<<set _dPops = 0>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<</silently>>
When you turn toward camp again, the matter feels settled, if not peaceful. Your people return with full hands, while the strangers disappear in whatever direction still carries them away from the Unmoving.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">+<<print _dRes>> Resources, +<<print _dGoods>> Goods</span>
</div>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<elseif $questLastCheck.ok>>
<<if _choice is "attack">>
You give the signal with a short motion of two fingers. Your hunters move at once.
The strangers try to brace, but fear has left them rigid and the first clash breaks their line quickly. Spearheads find throats, stone blades open bellies, and one man who turns to run is dragged down before he gets far. The screams behind them do little to change the outcome.
It ends quickly. Those still standing throw down their weapons and offer up empty hands rather than invite another charge.
<<silently>>
/* ATTACK SUCCESS: gain food/resources/goods and a few pops (3–4) */
<<set _dFood = 16>>
<<set _dRes = 8>>
<<set _dGoods = 3>>
<<set _dPops = 3>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
You take their supplies, their food, and the survivors who still have enough strength to work. The walk back is heavier, with packs full, hands stained, and unfamiliar faces moving between your hunters’ spearpoints.
<<else>> <!-- absorb -->
You step closer, near enough that the strangers cannot mistake who is speaking for your side. You tell them about your camp: fires that are kept burning, hunts carried out in numbers, and rules meant to keep knives from turning inward when food grows scarce.
You do not promise comfort. What you offer is a place in the tribe, along with the work and obedience that place demands.
Their front-man hesitates. Pride keeps him upright for a moment, but hunger has had longer to work on him. One spear lowers, then another. A woman steps forward with a child against her hip, watching you with the courage of someone who has run out of better choices.
<div class="dialogue-inset">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">You don’t need to say anything. If you’re coming, then come.</span>
</div>
After a long moment, the first of them steps forward. The others follow.
<<silently>>
/* ABSORB SUCCESS: get all pops (6–7), all food/resources/goods */
<<set _dFood = 20>>
<<set _dRes = 10>>
<<set _dGoods = 4>>
<<set _dPops = 7>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
Their bundles, tools, and last stores of dried meat now travel with the same group. The newcomers stay close together on the walk toward camp, while your hunters keep a watchful ring around them.
<</if>>
By the time the smoke from your campfires reaches you again, the result of the expedition is obvious in the group returning with you. Your tribe is larger, better supplied, and perhaps a little more certain of its place in this new land.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">
<<if _choice is "attack">>
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods, +<<print _dPops>> Pops
<<else>>
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods, +<<print _dPops>> Pops
<</if>>
</span>
</div>
<<if _aspGainLabel>>
<div class="result-line">
<span class="label">Aspect</span>
<span class="value"><span style="color:#2f7d32;"><<print _aspGainLabel>></span>, <span style="color:#b3261e;"><<print _aspLossLabel>></span></span>
</div>
<</if>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
You misjudge the moment just enough for the clean outcome you intended to slip away.
<<if _choice is "attack">>
You give the signal and your hunters surge forward, but a brief hesitation gives the strangers time to meet them properly. Their line does not collapse the way it should.
One of yours takes a spearpoint through the forearm. Another catches a rock across the cheek and keeps fighting with blood in his mouth. The clash turns into a scramble on bad ground, full of slipping feet and short-range stabbing.
Your numbers still carry the fight, but the victory costs far more than it should have.
<<silently>>
/* ATTACK FAIL: still gain food/resources/goods, but lose 2–3 pops */
<<set _dFood = 12>>
<<set _dRes = 6>>
<<set _dGoods = 2>>
<<set _dPops = -2>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
You take what can still be carried, but your hunters carry bodies as well. The walk back is quiet.
<<else>> <!-- absorb -->
You speak, but distrust has already hardened their answer. You describe the camp and offer them a place within it, yet they hear the conditions more clearly than the promise.
Their front-man never stops watching your hands. He is listening, but he is also counting the ways out. Behind him, a child coughs and a woman pulls the child closer.
They do not attack, but they do not join either. Instead, they begin to withdraw step by careful step, refusing to turn their backs until there is enough distance to run. Your hunters watch them go with a slow, sour anger.
<<silently>>
/* ABSORB FAIL: still gain all food/resources/goods, but lose medium zeal/stability */
<<set _dFood = 20>>
<<set _dRes = 10>>
<<set _dGoods = 4>>
<<set _dPops = 0>>
<<set _dZeal = -4>>
<<set _dStab = -4>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $zeal = Number($zeal ?? 0) + _dZeal>>
<<set $stability = Number($stability ?? 0) + _dStab>>
<</silently>>
You still claim what they cannot carry quickly enough: abandoned bundles, dropped tools, and food left behind in the retreat. The supplies are useful, but no one mistakes the outcome for the triumph they expected.
Some of your people wanted a miracle and others wanted a clean victory. Instead, they return with more questions than answers.
<</if>>
By the time your fires come into view, the tribe is already turning the expedition over in conversation, arguing about what went wrong and what should have happened instead.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods
<<if _dPops>>
, <<print (_dPops > 0 ? "+" : "")>><<print _dPops>> Pops
<</if>>
</span>
</div>
<<if _choice is "attack">>
<div class="result-line bad">
<span class="label">Lost</span>
<span class="value"><<print -_dPops>> Pops</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Strain</span>
<span class="value"><<print _dZeal>> Zeal, <<print _dStab>> Stability</span>
</div>
<</if>>
<<if _aspGainLabel>>
<div class="result-line">
<span class="label">Aspect</span>
<span class="value"><span style="color:#2f7d32;"><<print _aspGainLabel>></span>, <span style="color:#b3261e;"><<print _aspLossLabel>></span></span>
</div>
<</if>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>" "Quest_Tutorial_End">><</link>>
</div><<silently>>
<<run setup.playAmputation ? setup.playAmputation() : null>>
<<set _view = setup.regionUnification.getCompletionView()>>
<<set _snapshot = _view.snapshot>>
<</silently>>
''<div class="hub-textbox">
Not so long ago, you entered these lands with barely a few dozen people at your back. Tired from the journey, hungry, carrying almost everything your tribe still possessed with you.
Looking around now, it is difficult not to see how much has changed.
<<if _snapshot.allDestroyed or _snapshot.outcome is "allDestroyed">>
The last of your enemies are gone.
One by one, every tribe that contested these lands has been broken. Some died with weapons in their hands. Others scattered when there was no longer anything left to defend. Those worth taking now live among your own people, their strength, knowledge, and labor turned toward building what you have created.
No rival fires remain.
There is no neighboring chief left to bargain with, threaten, or fear. No other tribe in these lands can claim a future separate from the one you decide for them.
For better or worse, the region answers to you.
<<elseif _snapshot.allFederated or _snapshot.outcome is "allFederated">>
Yet the strangest part may be how little of what surrounds you was built from ashes.
Every tribe that once watched your arrival with suspicion now stands beside you.
<<if _view.leaderCount is 1>><<print _view.leaderNames>> still leads their own people.<<else>><<print _view.leaderNames>> still lead their own people.<</if>> Their fires still burn beneath their own names. But when danger comes, when food is scarce, when one tribe calls upon another, they no longer look only inward.
You have taken peoples who might easily have spent generations raiding, feuding, and fearing one another, and given them reason to stand together.
<<if _view.greatBindingComplete>>
And what joins them now is more than an alliance of convenience. The tribes retain their names and their leaders, but the Great Binding has made something new from them, something meant to endure beyond a single bargain, crisis, or generation.
<</if>>
<<else>>
Some would not bend.
Their fires are cold now. Their warriors are dead, scattered, or broken, and those among them worth taking have been folded into your growing tribe. Their hands work beside yours. Their hunters walk beneath your authority. What strength they once used against you now serves to carry your people further.
But you do not stand alone, either.
<<if _view.leaderCount is 1>><<print _view.leaderNames>> stands with you, and their tribe with them.<<else>><<print _view.leaderNames>> stand with you, and their tribes with them.<</if>> Friends. Allies. Peoples who once watched your camp with suspicion now share news, trade, and promises of aid.
For all the blood spilled to reach this point, not every rival needed to become an enemy.
<<if _view.greatBindingComplete>>
And even //allies// no longer seems quite enough to describe what binds you together. The tribes still have their own names, their own fires, their own leaders, but more and more, they move as parts of something greater.
<</if>>
<</if>>
<<if _view.kaelPresent>>
Kael, as usual, is busy making certain all of it actually works. You spot him near the stores, directing where baskets, hides, tools, and bundles should go, looking perhaps a little more tired than usual beneath the weight of all the extra work.
<</if>>
<<if _view.halonaPresent>>
Halona stands near one of the busier paths through camp, watching unfamiliar faces come and go. Every so often someone stops to ask her something, and she answers with that same clipped certainty of hers before sending them on their way.
<</if>>
<<if _view.wildlingPresent>>
<<if _view.wildlingName>><<print _view.wildlingName>><<else>>The wildling<</if>> has found herself a place just beyond the worst of the bustle. Her eyes move from face to face, quietly tracking newcomers, visitors, and familiar tribesmen alike as they pass through the growing camp.
<</if>>
Morag's tent seems to have become a destination of its own. Someone is always arriving with a complaint, a question, or an injury, and she accepts each interruption with the weary irritation of a woman who long ago gave up expecting peace.
It is easy, sometimes, to lose sight of just how thoroughly the balance of these lands has changed.
The surrounding tribes have been broken or brought to your side. Your people have room to breathe. Hunters can range farther. Supplies can move without every journey becoming a gamble. Scouts can look beyond the nearest rival camp instead of forever watching for the next raid.
For the first time since arriving in these lands, your tribe does not need to concern itself merely with holding its place here.
You have made that place your own.
<<if _view.mishanKnown>>
And beyond that hard-won order, one name remains.
''Mishan.''
Until now, they have loomed over scattered tribes, each occupied with its own enemies and its own survival.
That is no longer true.
You came to these lands with a few dozen tired people at your back.
Now an entire region stands behind you.
Soon, Kavonok will learn the difference.
<</if>>
<div class="result-list">
<div class="result-line good"><span class="label">The Region Is Unified</span><span class="value">Completed</span></div>
<<if _view.mishanKnown>>
<div class="result-line good"><span class="label">Mishan Preparedness</span><span class="value">+<<print _view.preparednessGain>></span></div>
<<else>>
<div class="result-line good"><span class="label">Result</span><span class="value">Your great feat will leave you more prepared for the crisis to come.</span></div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("amputation") : (typeof SimpleAudio !== "undefined" && SimpleAudio.select("amputation") ? SimpleAudio.select("amputation").stop() : null)>>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<set _completion = setup.oldBones.completeWhatWeLeaveBehind()>>
<</silently>>
''<div class="hub-textbox">
The stone is there.
Large. Grey. Cracked almost cleanly through its middle.
You stop before it.
The ground around the low rise looks no different from any other patch of earth.
Of course it does.
However long the strange little man has been dead, what he buried has been waiting even longer.
You begin to dig.
At first, there is only earth.
Roots.
Loose stone.
More earth.
Then your fingers brush against something that crumbles beneath them.
Cloth.
Or what remains of it.
You clear the ground more carefully.
Dark metal slowly emerges.
First one end.
Then another.
You pull it free.
<<cgimg "images/expeditions/what_we_left_behind/old_iron_found.png" "Old Iron held above the freshly disturbed earth">>
The shape is strange, but its purpose is not.
A weapon.
One end is bound for the hand, though whatever once covered the grip has mostly rotted away. From it extends a long, narrow piece of metal, ending abruptly in an old break.
You turn it over.
Age has stained nearly every part of it. The edge is dull. The broken end is ugly and uneven.
Still...
You take it in one hand.
Heavy.
Not enough to trouble you, but heavier than its size suggests.
You test the balance.
Then swing.
The weapon cuts through the air cleanly.
Again.
Harder.
You bring the dark metal down against a loose stone beside the hole.
The stone splits.
A few of your people flinch at the sound.
You look at the weapon.
Nothing.
Not a new crack.
Not a bend.
You run a thumb across the old break.
Whatever tore this thing apart happened long before the little man carried it beneath the sun.
And yet, after all this time beneath the earth, you cannot seem to make it any worse.
Your gaze lingers on the dark metal.
The dead man dragged it through a land he hated.
Buried it when he could carry it no farther.
Died believing he would return.
You think you understand why.
Perhaps it is time someone finally carried it away.
<div class="result-list">
<div class="result-line good">
<span class="label">Item Acquired</span>
<span class="value">Old Iron</span>
</div>
<div class="result-line good">
<span class="label">Task Completed</span>
<span class="value">What We Leave Behind</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Take the old iron with you...</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<set _hunt = setup.whiteAntler.enterExpedition()>>
<</silently>>
''<div class="hub-textbox">
<<if _hunt.ok>>
The trail is not difficult to find.
Deep prints cut through the earth where something heavy passed between the trees. Bark has been scraped from low branches, and here and there you find pale strands of fur caught against rough wood.
You follow slowly.
Eventually, movement appears ahead.
The stag stands between the trees.
<<cgimg "images/expeditions/white_antler/white_antler.png" "The White Antler">>
Even knowing what to expect does little to prepare you for its size. Its pale body rises above the surrounding brush, thick-necked and powerful, while the great spread of its antlers reaches outward like the branches of a dead tree.
For several moments, it does nothing but watch you.
Then its ears twitch.
Its weight shifts.
It will not remain still for long.
<<if _hunt.showIntro>>
The signs around its trail give you another possibility.
The animal has stopped repeatedly to feed. With enough food, and something sturdy enough to keep it in place, you may be able to prepare bait worth slowing even this creature down for.
A new recipe comes to mind.
White Antler Bait.
<div class="result-list">
<div class="result-line good"><span class="label">Recipe unlocked</span><span class="value">White Antler Bait</span></div>
</div>
<</if>>
<<else>>
The expedition is no longer available here.
<</if>>
</div>''
<div class="hub-buttons">
<<if _hunt.ok>>
<<button "<span class='choice-text'>Bring it down before it can run.</span>">>
<<run setup.whiteAntler.chooseAttempt("strength")>>
<<goto "Quest_WhiteAntler_Resolve">>
<</button>>
<<if _hunt.hasBait>>
<<button "<span class='choice-text'>Draw it close with prepared bait.</span>">>
<<run setup.whiteAntler.chooseAttempt("wisdom")>>
<<goto "Quest_WhiteAntler_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires White Antler Bait."><span class="choice-text">Draw it close with prepared bait.</span></span>
<</if>>
<<button "Turn back for now.">>
<<run setup.whiteAntler.turnBack()>>
<<goto "Hub_1">>
<</button>>
<</if>>
</div><<silently>><<set _attempt = setup.whiteAntler.getAttempt()>><</silently>>
''<div class="hub-textbox">
<<if _attempt and _attempt.resolved>>
<div class="result-list result-list-check">
<<if _attempt.success>><div class="result-line good"><span class="label"><<print _attempt.route is "strength" ? "Strength check" : "Wisdom check">></span><span class="value">SUCCESS</span></div><<else>><div class="result-line bad"><span class="label"><<print _attempt.route is "strength" ? "Strength check" : "Wisdom check">></span><span class="value">FAIL</span></div><</if>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _attempt.roll>></span></div>
<div class="result-line"><span class="label"><<print _attempt.route is "strength" ? "Strength" : "Wisdom">> + d20 vs DC</span><span class="value"><<print _attempt.total>> / <<print _attempt.dc>></span></div></div>
<<if _attempt.route is "strength" and _attempt.success>>
You move before the stag can.
There is no patience in the attack. No careful attempt to outwit it.
You close the distance and commit everything to bringing the animal down before it can escape.
The stag explodes into motion.
Fast.
Faster than any animal you have ever hunted.
But you are faster.
You catch it as it turns.
One hand closes around the base of an antler while the other crashes into the thick muscle of its neck. The impact nearly tears the animal from its feet.
Nearly.
The stag bellows and surges beneath you.
Its entire body twists with sudden, violent strength. Hooves gouge trenches through the earth. Its antlers sweep sideways, forcing you to wrench your torso clear before one of the points can open your belly.
For a moment, neither of you gives ground.
Then you force its head downward.
The stag fights harder.
Muscle bunches beneath its white hide as it drives forward, dragging your feet through loose soil. You feel the tendons in its neck straining beneath your grip, the hot rush of its breath, the frantic hammering of its heart.
An ordinary hunter would have been thrown aside.
You tighten your hold.
One arm locks beneath its jaw.
The other braces across the back of its skull.
You twist.
The animal resists with everything it has.
For a heartbeat, the two of you remain locked together.
Then something gives.
A deep crack travels through the stag's neck.
Its strength disappears almost instantly.
The enormous body drops beneath you, legs folding awkwardly as its weight crashes into the earth.
Silence follows.
Up close, its size is even more remarkable.
So is the hide.
So are the antlers.
There will be food enough for the tribe.
The rest deserves to be kept.
<div class="result-list"><div class="result-line good"><span class="label">Gain</span><span class="value">100 Food</span></div><div class="result-line good"><span class="label">Item acquired</span><span class="value">White Antler</span></div><div class="result-line good"><span class="label">Item acquired</span><span class="value">Pale Stag Hide</span></div></div>
<<elseif _attempt.route is "strength">>
You rush it.
The stag reacts almost instantly.
Its head drops, forcing you aside beneath the sweep of its antlers, and before you can recover it is already crashing through the brush.
You pursue until the sound of its movement finally disappears.
There is no point continuing blindly.
The White Antler has escaped again.
This time, it has gone far enough that its trail is no longer obvious.
If you want another chance, you will have to find it first.
<<elseif _attempt.success>>
You leave the bait where the stag can find it and withdraw.
Then you prepare.
The wind is right.
The surrounding brush narrows the animal's approach from one side, while a fallen trunk blocks the easiest escape in the other direction.
You choose the remaining path.
Then you wait beside it with your spear.
For a long while, nothing happens.
Eventually, white appears between the trees.
The stag.
It approaches the bait cautiously, stopping again and again to raise its head and test the air.
You remain still.
It comes closer.
One step.
Then another.
Its head finally lowers.
You wait.
The stag shifts its weight.
Now.
You rise from concealment and drive forward.
The animal reacts immediately, muscles coiling beneath its hide as it tries to throw itself away from the danger.
Exactly where you expected.
Its escape carries it directly across your path.
You plant one foot and thrust.
The spearhead punches through pale hide just behind the shoulder.
The stag screams.
It surges forward anyway, nearly wrenching the shaft from your hands as its own momentum drives the stone point deeper.
You let it run.
Not far.
Its stride falters within moments.
Blood streaks the white fur along its side. One foreleg buckles.
The great stag crashes through the brush and collapses heavily against the earth.
You approach carefully, spear ready.
Its chest rises once.
Then again, with far more effort.
Then stops.
No contest of strength was needed.
The stag was faster.
Stronger than any ordinary prey.
It simply never realized where the trap truly was until the spear was already inside it.
There will be food enough for the tribe.
The hide and antlers are another matter entirely.
Those are worth keeping.
<div class="result-list"><div class="result-line"><span class="label">Consumed</span><span class="value">White Antler Bait</span></div><div class="result-line good"><span class="label">Gain</span><span class="value">100 Food</span></div><div class="result-line good"><span class="label">Item acquired</span><span class="value">White Antler</span></div><div class="result-line good"><span class="label">Item acquired</span><span class="value">Pale Stag Hide</span></div></div>
<<else>>
The bait works.
At least at first.
The stag emerges slowly and approaches the food, its head dipping as it tests the air.
You wait for the right moment.
A little too long.
Something changes.
Perhaps the wind turns. Perhaps the animal catches your scent. Perhaps creatures like this simply survive by knowing when something is wrong.
Its head snaps upward.
Then it is gone.
The bait is scattered beneath its hooves as the White Antler tears away through the trees.
By the time you reach the trail, even the sound of it has disappeared.
The White Antler has escaped again.
You will need to find where it went before another attempt can be made.
<div class="result-list"><div class="result-line"><span class="label">Consumed</span><span class="value">White Antler Bait</span></div><div class="result-line good"><span class="label">Recipe available</span><span class="value">White Antler Bait</span></div></div>
<</if>>
<<else>>The hunt has no result to show.<</if>>
</div>''
<div class="hub-buttons"><<button "Return to camp.">><<goto "Hub_1">><</button>></div><<silently>>
<<set _tribeId = "npc_camp_1">>
<<set _tribeName = (setup.tribes && setup.tribes.getById)
? (setup.tribes.getById(_tribeId)?.name ?? "Unknown Tribe")
: "Unknown Tribe">>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<</silently>>
<div id="wildling-wrap">
''<div class="hub-textbox story-scroll-has-inline-actions">
<p>Some time after your first encounter with the wild woman, a rare stretch of quiet gives you the chance to look for her again.</p>
<p>You expect the search to be simple.</p>
<p>It is not.</p>
<p>A full day passes without anything useful. Then another. She leaves almost nothing behind: no clear trail, no smoke, no discarded scraps, nothing obvious enough to follow. Only the memory of where she vanished and the occasional sign that might belong to her or might belong to anyone else moving through the woods.</p>
<p>By the fifth day, even you are beginning to suspect the effort is wasted. You have already turned back toward camp when a scream carries through the trees.</p>
<p>A man's scream.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Gaaah! You bitch!”</span></div>
<p>You change direction and move toward the sound without announcing yourself.</p>
<p>What you find is not a hunt.</p>
<p>One hunter is clutching a bleeding hand. A finger is missing at the knuckle. Several steps away, the wild woman is pinned beneath another man's knee.</p>
<p>Even restrained, she is still fighting. She twists, spits, snaps her teeth, and searches constantly for anything close enough to hurt.</p>
<p>The man holding her catches a fistful of hair, jerks her head back, and strikes her across the face.</p>
<p>Something small lands in the dirt beside them.</p>
<p>The missing finger.</p>
<p>He leans closer to her.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“You hunt on <<print _tribeName>> territory, woman. You pay tribute, or you join the tribe if you want to take what's ours.”</span></div>
<p>She snarls at him.</p>
<p>She does not understand his language. Even if she did, the answer would probably be the same.</p>
<p>The injured hunter forces a grin through the pain.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Can't even talk. Fine. We'll get what we're owed one way or another.”</span></div>
<p>The tone makes their intention clear before either of them acts on it.</p>
<p>They believe nobody is watching.</p>
<p>They are wrong.</p>
<p>You remain behind the brush, close enough to see the scene and still unnoticed.</p>
<p>The question is no longer what these men intend to do.</p>
<p>The question is whether you stop them.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Intervene</span>">>
<<set $q_wildling_choice = "intervene">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
<<button "<span class='choice-text'>Keep watching for a moment</span>">>
<<set $q_wildling_choice = "watch">>
<<replace "#wildling-wrap">>
<<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags.q_wildling_01_watched = true>>
<</silently>>
''<div class="hub-textbox story-scroll-has-inline-actions">
<p>You remain where you are and watch a little longer.</p>
<p>The men stop talking.</p>
<p>The injured hunter grabs at the woman's clothing and tears it away while the other keeps her pinned. She uses the small freedom the movement gives her to kick backward, catching one of them hard enough to make him curse.</p>
<p>It changes nothing.</p>
<p>They strike her again and force her down. What follows is not ambiguous and not consensual. The two men begin sexually assaulting her while she fights them with everything she has left: kicking, twisting, clawing at their arms, spitting blood, refusing to become passive even when they overpower her.</p>
<<nsfwimg "images/expeditions/WildlingQuest/Watch.webp">>
<p>Her resistance turns the assault into a violent struggle rather than submission, but there are two of them and only one of her.</p>
<p>You have seen enough.</p>
<p>There are only two meaningful endings you can still choose from.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Intervene</span>">>
<<set $q_wildling_choice = "intervene">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
<<button "<span class='choice-text'>Let it happen and leave</span>">>
<<set $q_wildling_choice = "leave">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
</div>
</div>''
<<run (function () {
function goTop() {
try { $("#passages").scrollTop(0); } catch (e) {}
try { $("#content-wrapper").scrollTop(0); } catch (e) {}
try { $(".hub-textbox").scrollTop(0); } catch (e) {}
try { $(".passage:visible").scrollTop(0); } catch (e) {}
try { window.scrollTo(0, 0); } catch (e) {}
}
goTop();
try { requestAnimationFrame(goTop); } catch (e) {}
setTimeout(goTop, 0);
})();>>
<</replace>>
<</button>>
<<button "<span class='choice-text'>Let it happen and leave</span>">>
<<set $q_wildling_choice = "leave">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
</div>
</div>''
</div><<silently>>
<<run setup.wildlingSecondQuest.beginTrailAttempt()>>
<<set _check = $wildlingSecondTrailCheck>>
<<set _returnToCamp = !!_check.returnToCamp>>
<</silently>>
<div class="hub-textbox">
<div class="result-list">
<<if _check.rawOk>>
<div class="result-line good"><span class="label">Task check</span><span class="value">SUCCESS</span></div>
<<else>>
<div class="result-line bad"><span class="label">Task check</span><span class="value">FAIL</span></div>
<</if>>
<div class="result-line"><span class="label">Wisdom + d20 vs DC</span><span class="value"><<print _check.total>> / <<print _check.dc>></span></div>
<<if _check.assisted>>
<div class="result-line good"><span class="label">Progress</span><span class="value"><<print $wildlingName>> finds the trail</span></div>
<<elseif _returnToCamp>>
<div class="result-line bad"><span class="label">Outcome</span><span class="value">Return to camp and try again</span></div>
<</if>>
</div>
<<if _check.attemptsBefore > 0 and _check.assisted>>
<p>By the time you return, the hunter is somehow even more certain that he remembers the route. That certainty lasts until the same stretch of broken stone. He stops. Again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“...I know this place.”</span></div>
<p><<print $wildlingName>> lets out a sigh beside you. So do you. The hunter either fails to notice or decides not to. He starts toward one slope. <<print $wildlingName>> catches your wrist. You stop. She points in the opposite direction. Then crouches. At first, you see nothing. She brushes aside a layer of damp leaves. Beneath them, a shallow impression cuts across the soil. A heel.</p>
<p>Another sits farther ahead. Then another. The trail had been there the entire time. You simply missed it. <<print $wildlingName>> looks up at you. Her expression is unbearably pleased with itself. You straighten. She immediately moves ahead, following signs so faint that even after she shows you where to look, some are difficult to see. The hunter hurries after her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Yes. Right. That's it.”</span></div>
<p><<print $wildlingName>> glances back at him with an expression that makes her opinion of his guidance perfectly clear. You decide not to translate. The trail is yours again.</p>
<<else>>
<p>The hunter leads you away from camp with considerably more confidence now that his wounds have had time to recover and he has had a chance to rest. At first, there is little reason for you to doubt him. A split oak. A shallow stream. A strangely shaped boulder. Each landmark comes with an immediate nod and another gesture deeper into the woods.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“This way, Chief.”</span></div>
<p>Then the certainty starts to fade. A game trail divides around a cluster of thorn bushes. He slows. Looks left. Then right.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“...Left.”</span></div>
<p>You follow. A short while later, the trail simply disappears into a stretch of broken stone. The hunter stops again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“No. Wait.”</span></div>
<p>He turns. Looks back the way you came. Then toward an entirely different slope. You walk a few steps farther and see, in order: A split oak. A shallow stream. And a strangely shaped boulder. His confidence, it would seem, has survived the journey considerably better than his memory. <<print $wildlingName>> watches him in silence. Her eyes move from the hunter to the ground. Then back to him. You recognize the expression. She is not impressed.</p>
<<if _check.rawOk>>
<p>You leave the hunter to his increasingly uncertain recollection and crouch beside the disturbed earth. There is still a trail here. Just not the kind he was looking for. A snapped stem beneath the brush. Mud pressed into the underside of a stone. A faint streak of old blood where something passed too close to the rocks. You point it out. The hunter stares for a moment. Then recognition returns.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Yes. Yes, that's it.”</span></div>
<p>His confidence restored, he immediately starts in what he assumes is the right direction. Before he gets far, <<print $wildlingName>> slips past him. She crouches several paces ahead. One hand brushes across the ground. Then she shakes her head and points leftward.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Trail go left. Not straight. Stupid.”</span></div>
<p>You follow her indication. More tracks. Human. At least three. She points deeper into the trees. The hunter squints after her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“That's where we went.”</span></div>
<p>This time, you are inclined to believe him. Between what you found and what <<print $wildlingName>> has already picked out ahead, the trail is clear again.</p>
<<else>>
<p>You search the broken ground. Nothing. Or rather, too much. Animal tracks overlap older prints. Rain has softened the earth beneath the trees. Fallen leaves have buried whatever signs might once have been obvious. The hunter watches you work. Then begins looking as well. Neither of you finds anything useful. <<print $wildlingName>> crouches nearby, looking mildly bored. Her eyes flick across the ground. For a moment, you think she has found something. Instead, she looks back at you. Then at the hunter.</p>
<p>A small shrug of her shoulders. You do not need your strange gift for languages to understand the meaning. The hunter clears his throat.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“We're close.”</span></div>
<p>You look around. That is increasingly difficult to believe. Too much daylight has already been wasted wandering through the wrong stretch of forest. You can keep searching another day. For now, there is little choice but to return.</p>
<</if>>
<</if>>
</div>
<div class="hub-buttons">
<<if _returnToCamp>>
<<link "<span class='choice-text'>Return to camp</span>">><<run setup.wildlingSecondQuest.finishTrailAttempt()>><<goto "Hub_1">><</link>>
<<else>>
<<link "<span class='choice-text'>Continue</span>">><<run setup.wildlingSecondQuest.finishTrailAttempt()>><<goto "Quest_WildlingSecond_02">><</link>>
<</if>>
</div><div class="hub-textbox">
<p>Once the trail is found, progress comes much easier. The hunter's memory improves whenever the path itself is there to remind him. A bent sapling. A patch of disturbed moss. Old blood dried dark against pale stone. He points them out as you go, occasionally looking toward you as though expecting confirmation. You give it when necessary. Mostly, you walk. <<print $wildlingName>> does the same. For a while, the only sounds are boots against earth, leaves shifting beneath your feet, and the occasional call of something hidden deeper in the forest. The hunter lasts perhaps half an hour.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“You know, Chief...”</span></div>
<p>You glance toward him.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“You don't talk much.”</span></div>
<p>You raise an eyebrow.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Not saying it's bad.”</span></div>
<p>A pause.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Actually, I think people like it.”</span></div>
<p>Another pause.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Makes you seem...”</span></div>
<p>He searches for the word.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Stoic.”</span></div>
<p>You continue walking.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“See? Exactly like that. Like none of it bothers you.”</span></div>
<p><<print $wildlingName>> looks between the two of you. You suspect she understood very little of the exchange. The hunter notices her watching.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“She's not much of a talker either, is she?”</span></div>
<p><<print $wildlingName>> narrows her eyes.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Er... not that there's anything wrong with that. Plenty of people at camp who aren't particularly talkative.”</span></div>
<p>Though some apparently are. He gestures vaguely.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Though I suppose she's got an excuse, at least.”</span></div>
<p><<print $wildlingName>> mutters under her breath.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Bad hunter. Too much talk.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“What?”</span></div>
<p>You tell him to keep walking.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“...Right.”</span></div>
<p>For perhaps ten full breaths, he manages silence. Then:</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Anyway—”</span></div>
<p>The trail carries on. Gradually, the ground begins to change. Trees thin around protruding shelves of stone. Roots twist through old cracks. Moss covers low shapes that at first look natural. Then one of them catches your eye. Too straight. Too deliberate. You stop. <<print $wildlingName>> takes two more steps before noticing. She turns back. Ahead, half swallowed by the forest, stand the remains of something that has not been used in a very long time. A ring of stones. Rotten posts leaning beneath vines. The shallow outlines of shelters long since collapsed into the earth. An old camp. The hunter looks around.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Huh. Don't remember this...”</span></div>
<p><<print $wildlingName>> looks around as well. Her gaze lingers briefly on one of the collapsed shelters. Then she moves on. The trail cuts directly through the ruins. Whatever happened here, it happened long before any of you arrived. For now, the missing hunters are still somewhere ahead. And the light is already beginning to thin.</p>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_03">><</button>>
</div><<silently>><<set _echoes = setup.wildlingSecondQuest.getEchoesStatus()>><</silently>>
<<if !$questFlags.q_wildling_second_echoes_seen>>
<div class="hub-textbox">
<p>The trail does not stop at the ruins. It passes straight through them. Still, you slow. There is enough left here to invite curiosity. Not much. Time has done most of the work. The shelters are little more than shallow depressions beneath collapsed timber and creeping roots. Moss covers the stones of old hearths. Here and there, fragments of worked bone and cracked pottery remain half buried beneath the soil. The hunter nudges one loose stone with his foot.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Been empty a long time.”</span></div>
<p>You nod. Twenty summers, perhaps. Long enough for the forest to reclaim almost everything. <<print $wildlingName>> wanders a short distance away. Her attention moves across the ruins with the same quiet intensity she gives most unfamiliar things. She pauses beside one of the collapsed shelters. Looks down. Then steps around a patch of earth nearly hidden beneath moss. You follow her gaze. Only after brushing some of the growth aside do you realize there is an old firepit underneath. Nothing remarkable. <<print $wildlingName>> has already moved on, looking around curiously. The hunter watches her for a moment.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“She find something?”</span></div>
<p>You shake your head. Probably not. You continue looking. A broken stone blade. The remains of a drying rack. A few animal bones, split long ago for marrow. Nothing worth taking. Nothing that tells you more about your missing tribesmen. The trail of your missing hunters remains visible on the far side of the ruins, but the light filtering through the trees has begun to soften. You are about to move on when something pale catches beneath the roots of a fallen tree. Bone. Human.</p>
<p>You crouch beside it. The remains have been here for years. Most of the skeleton lies half covered by earth and leaf mould, one arm twisted beneath the roots where the tree eventually grew over it. A second skull rests several paces away. Whether the two died together or were simply left here by the same violence, there is no way to tell. The hunter looks down at them dispassionately.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Old.”</span></div>
<p><<print $wildlingName>> pays the remains little attention at first, still occupied with the ruins around her. Then she notices your interest. Curiosity gets the better of her, and she wanders closer.</p>
</div>
<div class="hub-buttons">
<<link "<span class='choice-text'>Ignore the remains and continue searching.</span>">><<set $questFlags.q_wildling_second_remains_choice = "leave">><<goto "Quest_WildlingSecond_04">><</link>>
<<if _echoes.canUse>>
<<link "<span class='choice-text'>Third Eye: Lingering Echoes — 20 Belief</span>">><<if setup.wildlingSecondQuest.commitEchoes()>><<goto "Quest_WildlingSecond_03A">><</if>><</link>>
<<elseif !_echoes.owned>>
<span class="macro-button disabled" aria-disabled="true" title="Requires Lingering Echoes Power."><span class="choice-text">Third Eye: Lingering Echoes — 20 Belief</span></span>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 20 Belief."><span class="choice-text">Third Eye: Lingering Echoes — 20 Belief</span></span>
<</if>>
</div>
<<else>>
<div class="hub-textbox">
<div class="result-list"><div class="result-line bad"><span class="label">Belief spent</span><span class="value">-20</span></div></div>
</div>
<div class="hub-buttons">
<<link "<span class='choice-text'>Leave the remains and continue searching.</span>">><<set $questFlags.q_wildling_second_remains_choice = "leave">><<goto "Quest_WildlingSecond_04">><</link>>
<<link "<span class='choice-text'>Bury them.</span>">><<set $questFlags.q_wildling_second_remains_choice = "bury">><<goto "Quest_WildlingSecond_04">><</link>>
</div>
<</if>><div class="hub-textbox">
<p>You let your attention settle onto the bones as your third eye opens. The world loosens. You blink once. Twice. For a moment, the forest disappears. Your body feels lighter. Your heart pounds. Heat. Smoke. Voices. Not words at first. Just panic.</p>
<p>The memory sharpens. The camp is alive. Shelters stand where only depressions remain now. Fires burn between them. People run through smoke as figures rush in from beyond the trees. There is screaming. The clash of stone against wood. Someone falls. Only then do you notice something is wrong. Your hands. No. They are there. But they are wrapped tightly around something small, something squirming against your chest as you frantically look around. You look down.</p>
<p>A child. Very small. Too young to understand what is happening. You run. Away from the fighting. As far as possible. You duck behind one of the shelters and drop to your knees beside a narrow hollow beneath exposed roots. The child begins to make a sound. She is about to cry. You hush her gently, stroking her head, doing everything you can to keep the desperation from your voice. Slowly, she calms. You kiss her forehead.</p>
<p>Then place her into the hollow. Branches. Leaves. Loose earth. Anything that might hide her. The child reaches toward you. You freeze. For half a heartbeat, you want nothing more than to reach back. Then shouting comes closer. You turn away. Run. Away from the hollow.</p>
<p>Make noise. Draw them after you. The memory fractures. Hands seize you. You hit the ground. Dirt grinds against your cheek. Your furs are torn away. A knee pins you down. Pain. Blood. A man laughs somewhere above you. Another voice answers.</p>
<p>None of it matters. Your thoughts keep circling back to the hollow beneath the roots. To the child. Hidden. Quiet. Alive, you hope. Then nothing. The forest returns. You are crouched beside the bones. <<print $wildlingName>> is watching you, head tilted slightly. She has no idea what you just saw.</p>
</div>
<div class="hub-buttons">
<<button "Return to the remains">><<goto "Quest_WildlingSecond_03">><</button>>
</div><<silently>><<set _bury = $questFlags.q_wildling_second_remains_choice is "bury">><<if _bury>><<run setup.wildlingSecondQuest.applyBurialLove()>><</if>><</silently>>
<div class="hub-textbox">
<<if _bury>>
<p>You let out a slow breath. The vision was intense. Vivid. The ones near death often are. You begin moving earth. The hunter looks at you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Chief?”</span></div>
<p>You do not answer. There is little to explain. Whoever these people were, they have lain exposed long enough. You gather the bones carefully. What remains of them. The work is slow. Roots have grown between ribs. Soil clings to joints. Some pieces have already disappeared entirely into the earth. The hunter watches for a while, then eventually crouches to help. <<print $wildlingName>> does not. At first. She stands several paces away. Silent.</p>
<p>Watching your hands. Tilting her head, curious. Watching the bones disappear beneath the soil. You place a flat stone over the first shallow grave. Another beside it. A moment later, something settles beside your hand. A stone. You look over. <<print $wildlingName>> has crouched beside you. She does not look at your face. She simply reaches for another. Then another.</p>
<p>After a moment, she pauses and looks toward you, waiting. You nod. She seems pleased by the confirmation and continues. When she is done, she looks over the graves. Then at the stones she placed herself. A small, satisfied smile touches her face.</p>
<div class="result-list"><div class="result-line good"><span class="label">Wildling Love</span><span class="value">+10</span></div></div>
<<else>>
<p>There is nothing here that can help the missing hunters. Whoever died in this place did so long before you arrived in the region. You leave the bones where they are. <<print $wildlingName>> watches you move away. Then follows, continuing to look around.</p>
<</if>>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_05">><</button>>
</div><div class="hub-textbox">
<p>By the time you finish searching the ruins, the light has changed. Long shadows stretch between the trees. The trail continues beyond the old camp, but following it now would mean pushing deeper into unfamiliar ground with darkness close behind. The hunter looks toward the trees ahead. Then back the way you came.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“We could return.”</span></div>
<p>You could. It would mean several hours back to camp. Then the same journey again tomorrow. More lost time. The missing hunters have already been gone too long. If they are still alive, every delay matters. And even if they are not, the longer you wait, the less likely you are to learn what happened to them. The old ruins are dry. Sheltered. And, for the moment, quiet. Staying here makes more sense. The hunter seems to reach the same conclusion.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Better than walking that trail in the dark.”</span></div>
<p>You decide to remain in the ruins for the night. As you begin preparing the place, <<print $wildlingName>> clears loose debris from beneath a shallow stone overhang near one of the collapsed shelters. A decent place to sleep.</p>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_06">><</button>>
</div><<silently>>
<<set _wildlingRelationship = setup.wildlingSecondQuest.getRelationshipValues()>>
<<set _canWildlingLove = (_wildlingRelationship.love >= 60)>>
<<set _canWildlingObedience = (_wildlingRelationship.obedience >= 25)>>
<</silently>>
<div class="hub-textbox">
<p>The last of the daylight fades while you make the old camp livable. There is little to prepare. A small fire takes easily beneath the shelter of the stones. The hunter contributes what dried meat he brought, then lowers himself beside the flames with a tired groan. For a while, nobody says much. <<print $wildlingName>> eats quickly. The hunter does not. Apparently silence has become unbearable again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Could be worse.”</span></div>
<p>You look toward him. He gestures around at the ruins.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Dry ground. Fire. No rain.”</span></div>
<p>His eyes drift toward one of the collapsed shelters.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Dead people aren't much company, but they don't snore either.”</span></div>
<p>He chuckles at his own joke. <<print $wildlingName>> glances at him.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“What?”</span></div>
<p>She returns to her food. The hunter sighs.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“See? That's what I mean.”</span></div>
<p>You ignore him. Eventually, the meal is finished. The fire burns lower. Darkness settles properly over the forest. The hunter pushes himself back to his feet.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I'll take a look around before we sleep.”</span></div>
<p>You glance toward the trail. He follows your eyes.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Not too far.”</span></div>
<p>He taps the shaft of his spear against the ground.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Just the edge of the ruins. Maybe see if there's anything fresh farther along the trail.”</span></div>
<p>There is some sense in it. If whoever or whatever frightened the original hunting party is nearby, knowing before morning would be useful. Despite his easy demeanor, it is clear the two missing hunters are still weighing on him. The hunter stretches carefully, still favoring his injured side.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Besides, if I sit here much longer, I'll stiffen up.”</span></div>
<p>He looks between you and <<print $wildlingName>>. A faint grin appears.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“And I'm starting to think neither of you is going to entertain me.”</span></div>
<p><<print $wildlingName>> mutters without looking up.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Good.”</span></div>
<p>The hunter looks toward her.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I'm choosing to believe that was something kind.”</span></div>
<p>You let him. He adjusts his grip on the spear.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Won't be long, Chief.”</span></div>
<p>Then he disappears beyond the edge of the firelight. His footsteps remain audible for a while. Leaves shifting. The occasional snap of a twig. Then those too fade into the forest. The camp grows quiet. <<print $wildlingName>> watches the darkness where he vanished for a few moments. Eventually, whatever interest she had fades. She rises and retreats beneath the shallow stone overhang she cleared earlier, settling among the furs there. You remain beside the fire. For the first time since leaving camp, there is nobody else nearby. The flames crackle softly.</p>
<p><<print $wildlingName>> glances toward you. You catch her looking. She immediately looks somewhere else. A few moments pass. Another glance. Shorter this time. Then she shifts beneath the furs, apparently finding something fascinating about the stone beside her. You could leave things as they are. There is no reason the night has to become anything more than a night spent waiting for morning. If she wants otherwise, she can decide that for herself. Or you could make the decision for her. She is alone beneath the overhang. Close enough. And if you call her over, it will not be simply to talk.</p>
</div>
<div class="hub-buttons">
<<if _canWildlingLove>>
<<button "<span class='choice-text'>Wait.</span><span class='choice-note'>[60 Love]</span>">><<if setup.wildlingSecondQuest.chooseIntimacy("love")>><<goto "Quest_WildlingSecond_06_Love">><</if>><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 60 Love"><span class="choice-text">Wait.</span><span class="choice-note">[Requires 60 Love]</span></span>
<</if>>
<<if _canWildlingObedience>>
<<button "<span class='choice-text'>Order her to come to you.</span><span class='choice-note' style='white-space: nowrap;'>[25 Obedience]</span>">><<if setup.wildlingSecondQuest.chooseIntimacy("obedience")>><<goto "Quest_WildlingSecond_06_Obedience">><</if>><</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true" title="Requires 25 Obedience"><span class="choice-text">Order her to come to you.</span><span class="choice-note" style="white-space: nowrap;">[Requires 25 Obedience]</span></span>
<</if>>
<<button "<span class='choice-text'>Leave things as they are.</span>">><<if setup.wildlingSecondQuest.chooseIntimacy("neutral")>><<goto "Quest_WildlingSecond_06_Neutral">><</if>><</button>>
</div><div class="hub-textbox">
<p>You decide to wait. The fire settles. You feed it one branch and watch the sparks climb into the dark. Beneath the overhang, she is looking at you again. This time she holds it when you catch her. After a while she rises, gathers one fur around her shoulders, and crosses the open ground. She does not explain herself. She sits against your side, close enough that her shoulder presses your arm, and watches the fire with you like the overhang simply stopped being interesting.</p>
<p>The cold finds her anyway. The fur is thin, the stone leaches warmth, and inch by inch she leans heavier into you, until her back rests fully against your chest and she has quietly decided this is where she is now.</p>
<p>Her fingers find your hand first. She turns it over, traces the lines of your palm, presses the pads of your fingers one at a time. She lifts your hand to her face, drags her nose across the knuckles, and makes a small sound of approval at whatever she learns there. Then she explores upward, your wrist, your forearm, pushing the sleeve back to compare your skin against her own. You let her.</p>
<p>She grows bolder. She reaches back without looking to touch your jaw, your brow, the shape of your ear, cataloguing you the way she catalogued the old camp. When her fingers find your mouth you kiss them, and she goes very still, considering this new information. She turns around to face you, kneeling between your knees, studying your mouth now with single-minded focus. Her first kiss is mostly teeth. You correct her with your thumb at her jaw and she learns it immediately, the way she learns everything, and the second is softer, and the third she figures out on her own.</p>
<p>She presses her finger to your lips then, tilts her head toward the dark where the hunter went. You nod. This rule you both keep.</p>
<p>After that she is unhurried and thorough. She pulls her own clothes off when she is ready, fights a tangled hide, glares at it, wins. Your hands are permitted, then wanted, then demanded, her hips pushing into your palm while she studies your face to see what her body does to yours.
<<nsfwimgnew "images/expeditions/wildling_quest_1/l1.png">>
The first stretch of you inside her makes her hiss and go rigid, and she bites your shoulder to stay quiet, breathing hard through her nose until the sting burns off. Then she moves in her own rhythm, wet, clenching, furious with concentration, her smothered sounds breaking loose in small pieces against your neck.</p>
<<nsfwimgnew "images/expeditions/wildling_quest_1/l2.png">>
<p>She finishes with a shudder, teeth locked in your collarbone, and drags your release out of you a heartbeat later. She does not retreat. She drapes herself over your chest, pulls your arm around herself as though its proper place is obvious. Then her head snaps up. Listening.</p>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_07">><</button>>
</div><div class="hub-textbox">
<p>You decide to leave things as they are. <<print $wildlingName>> glances toward you once more, apparently waiting to see whether you intend to do anything. You do not. She settles back beneath the shallow overhang, pulling one of the furs around herself. You remain beside the fire, feeding another branch into it as the flames begin to sink. For a time, neither of you does much of anything. The forest is quiet. The fire is warm enough. Eventually, <<print $wildlingName>> lowers herself onto the furs. You settle in as well. Then she stills. Listening.</p>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_07">><</button>>
</div><div class="hub-textbox">
<p>You say her name once. She looks over at you from the overhang.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">"Come here."</span>
</div>
She doesn't move right away. Her eyes hold a war in them, pride against something newer and heavier, and then she rises and crosses the ground slower than the command deserved. She stops an arm's length away.</p>
<p>You hold out your hand. She stares at it for a long moment, jaw set, then takes it. You pull her down into your lap and turn her, arranging her back against your chest, her eyes on you sideways the whole time. She lets you reposition her. That is the lesson under the lesson. You tell her to be quiet, and tilt your head toward the dark. The hunter. She nods once. This rule she keeps absolutely.</p>
<p>You undress her piece by piece, unhurried. She assists when a knot defeats you, brisk and prideful even now, and her body answers your hands before her pride agrees to, her nipples hard in your palms, her breath shortening, her cunt hot and wet when your fingers check. She glares at your hand like it has cheated her. You seat her on your cock facing the fire.</p>
<<nsfwimgnew "images/expeditions/wildling_quest_1/o1.png">>
<p>She hisses once through her teeth and goes rigid, glaring back at you over her shoulder, and you hold her hips steady, keeping her stretched around you, waiting her out with your hands alone. When she finally adjusts, you tell her now, and she moves. The pace is yours.
<<nsfwimgnew "images/expeditions/wildling_quest_1/o2.png">>
Her muffled sounds leak out in fragments she strangles against her own wrist, and she finishes shaking, furious, clamped silent, her body surrendering in the exact measure her pride refuses to.</p>
<p>Afterward you keep her inside the circle of your arms. She stays. She was not asked, and some knot in her loosens by one degree she would never admit to. Then she stills. Listening.</p>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_07">><</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set _wildlingIntimacyChoice = $questFlags.q_wildling_second_intimacy_choice || "neutral">>
<</silently>>
<div class="hub-textbox">
<p>You hear it a heartbeat later. Or rather, you don't hear it. No footsteps. No sound. Too much time has passed. Whatever softness remained from the night disappears quickly.</p>
<<if _wildlingIntimacyChoice is "love" or _wildlingIntimacyChoice is "obedience">>
<p>You pull your furs back into place and gather your things. By the time you are done fastening the last tie, <<print $wildlingName>> is already dressed and crouched at the edge of the firelight, staring into the trees.</p>
<<else>>
<p>You rise and gather your things. <<print $wildlingName>> is already crouched at the edge of the firelight, staring into the trees.</p>
<</if>>
<p>You join her. There. A broken branch. Then another. The earth beyond the ruins has been disturbed. Not the careless trail your hunter made when he left. Something happened here. <<print $wildlingName>> moves first. You follow behind. The trail does not go far.</p>
<p>Voices reach you before the people themselves do. Judging by the slight narrowing of <<print $wildlingName>>'s eyes, she doesn't seem to understand them. But you do. Meaning settles into place as naturally as ever. You lower yourself behind a shelf of stone. <<print $wildlingName>> slips down beside you. Below, four figures move through the trees. Three carry spears. The fourth has his hands tied behind his back. Your hunter. His mouth is bloodied. His expression is furious. Alive, at least. One of his captors shoves him forward.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 1</span><span class="dialogue-line">“Move.”</span></div>
<p>Your hunter clearly understands the gesture, if not the word. He stumbles, catches himself, and immediately starts saying something back. Loudly. The captor beside him groans.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 2</span><span class="dialogue-line">“This one again.”</span></div>
<p>Another laughs.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“The loudmouth.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I don't know what you're saying, you ugly bastard, but I know you're talking about me!”</span></div>
<p>He receives another shove. The men laugh harder. One of them looks back toward the dark.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 1</span><span class="dialogue-line">“Still don't see the others.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 2</span><span class="dialogue-line">“I think the fool came alone. Didn't hear anyone else.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“Hah! Should've run and never looked back last time.”</span></div>
<p>That catches your attention. So does the next part.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 1</span><span class="dialogue-line">“Your friends are still tied. They'll be happy you're joining them.”</span></div>
<p>Your hunter does not react. He cannot understand them. <<print $wildlingName>>, however, notices your expression. She knows something important was said. The captors continue walking.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 2</span><span class="dialogue-line">“Chief wants to know how many more there are. They've probably got a camp nearby.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“Mhm. And if the rest are as smart as this one, maybe we can take them one by one.”</span></div>
<p>Another man snorts.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 1</span><span class="dialogue-line">“Next time they should send a woman.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 4</span><span class="dialogue-line">“Don't complain. Mishan'll take them. They always do.”</span></div>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“Last lot bought the chief that sharp spear he keeps showing off.”</span></div>
<p>Captor 4 spits into the dirt.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 4</span><span class="dialogue-line">“What good's that to me? You know I can't go near the walls without getting skinned.”</span></div>
<p>The others laugh. Their banter continues as they move deeper into the trees. For now, it seems your people are worth more to them alive than dead. Information. Captives. Something to sell. Your hunter is dragged farther along the trail. You shift your weight. Four ordinary men. Close. You could end this quickly. Your muscles tense as you prepare to move.</p>
<p><<print $wildlingName>> catches your wrist. You look at her. She shakes her head. Then points toward the captors. Toward the trail ahead. She leans close and whispers.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker"><<print $wildlingName>></span><span class="dialogue-line">“Wait. Follow. <<print $wildlingName>> know.”</span></div>
<p>Her meaning is clearer than the words. Follow them. They came from somewhere. The other hunters may be there. Still... Do you really want to let yourself be ordered around? Crushing these worms is nothing for you.</p>
</div>
<div class="hub-buttons">
<<link "<span class='choice-text'>Listen to <<print $wildlingName>>. Follow them.</span>">><<if setup.wildlingSecondQuest.chooseTactical("follow")>><<goto "Quest_WildlingSecond_08">><</if>><</link>>
<<link "<span class='choice-text'>Tell <<print $wildlingName>> what to do and attack now.</span>">><<if setup.wildlingSecondQuest.chooseTactical("attack")>><<goto "Quest_WildlingSecond_08">><</if>><</link>>
</div><<silently>>
<<if $wildlingSecondTacticalChoice is "follow">>
<<run setup.wildlingSecondQuest.setResolution("follow")>>
<<else>>
<<run setup.wildlingSecondQuest.beginStrengthCheck()>>
<</if>>
<<set _resolution = $questFlags.q_wildling_second_resolution>>
<</silently>>
<div class="hub-textbox">
<<if _resolution is "follow">>
<p>You lower your hand. <<print $wildlingName>> watches you for another moment. Then her grip leaves your wrist and she gives you a small nod. She turns toward the retreating captors. The decision made, she moves. You follow. The two of you keep far enough back that even your hunter's incessant complaining cannot cover careless movement. Fortunately, there is very little careless about <<print $wildlingName>>. She chooses where to step without hesitation. Avoids loose stone. Pushes branches aside slowly enough that they never snap. Twice, she stops you with a hand against your chest before one of the captors looks back.</p>
<p>Neither time are you entirely sure what warned her. One of them seems particularly intent on watching the darkness behind the group, though. Something is bothering him.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I swear, when the Chief finds you—”</span></div>
<p>Captor 2 drives a fist into his stomach. Your hunter folds around it, coughs, then forces himself upright again.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“That's right. Keep doing that. See what happens.”</span></div>
<p>Captor 2 shrugs and keeps walking. <<print $wildlingName>> glances toward you with a smile bordering on a smirk. You understand the look. Too much talk. Bad hunter. Maybe slightly useful this one time. Eventually the forest opens. Firelight flickers ahead. You slow at the edge of the trees. <<print $wildlingName>> does the same.</p>
<<elseif _resolution is "str_success">>
<div class="result-list"><div class="result-line good"><span class="label">Strength check</span><span class="value">SUCCESS</span></div><div class="result-line"><span class="label">Strength + d20 vs DC</span><span class="value"><<print $wildlingSecondStrengthCheck.total>> / <<print $wildlingSecondStrengthCheck.dc>></span></div></div>
<p>You shake your head. No. Waiting is unnecessary. You point toward the man at the rear. Then toward <<print $wildlingName>>. Hold him. Do not let him run. Understanding flashes across her face. You move. Captor 1 barely has time to turn. Your shoulder catches him beneath the ribs. The crack is loud, eclipsed only by the sound of his body hitting the tree behind him. He does not get back up.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 2</span><span class="dialogue-line">“What in the—”</span></div>
<p>He gets his spear halfway around. You catch the stone head in one hand. Your fingers close. Stone splinters. Using the shaft, you wrench him toward you. Your fist meets his face. The sound is wet. He hangs there for a moment before your foot pries him loose from your reddened hand and sends him sprawling into the dirt. Someone shouts. Captor 3 runs. <<print $wildlingName>> is already moving. She hits him from the side, low and fast.</p>
<p>Both disappear into the brush. A moment later she emerges, breathing hard, dragging him backward by one ankle while he claws uselessly at the earth. Blood covers part of her face. A ragged wound marks the side of his head where one ear used to be. Good. She followed the order without hesitation. Captor 4 freezes. Then decides to run. You don't bother chasing him. Instead, you bend and pick up a smooth stone from the ground. A good one. You draw your arm back and throw.</p>
<p>For a moment, the stone whistles through the darkness. Then it connects. Captor 4 staggers once. His body crumples a heartbeat later. Your hunter stares at the bodies. Then at you.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Chief.”</span></div>
<p>He sounds considerably happier to see you now than he did earlier. A nervous laugh slips out of him. You cut his bonds. The surviving captive begins speaking rapidly.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“Wait. Wait! I can—”</span></div>
<p>You ask where the others are. He stops. His eyes move toward the darkness. You ask again. This time he answers.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“Camp. They're at the camp.”</span></div>
<p>Good. You make him lead you there. <<print $wildlingName>> follows close behind him. He notices. He stops looking backward after that.</p>
<<else>>
<div class="result-list"><div class="result-line bad"><span class="label">Strength check</span><span class="value">FAIL</span></div><div class="result-line"><span class="label">Strength + d20 vs DC</span><span class="value"><<print $wildlingSecondStrengthCheck.total>> / <<print $wildlingSecondStrengthCheck.dc>></span></div></div>
<p>You shake your head. No. Waiting is unnecessary. You point toward the man at the rear. Then toward <<print $wildlingName>>. Hold him. Do not let him run. Understanding flashes across her face. You move. Captor 1 goes down before he understands what is happening. Captor 2 manages to raise his spear. It changes nothing.</p>
<p>You break through his guard and send him sprawling into the stones. You turn on the next one. Your fist catches him badly. Enough to stagger. Not enough to finish it. You hit him again. The others panic. That is the problem. Not strength. Timing. You mistimed it. You only have two hands.</p>
<p>Captor 4 bolts into the trees. <<print $wildlingName>> turns after him. Too late. Captor 3 is between her and the fleeing man, and by the time she knocks him aside, the runner has vanished into the dark. Your hunter shouts something useless after him.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“Run! Go on! Chief'll still find you!”</span></div>
<p>You cut his bonds. <<print $wildlingName>> watches the direction the man escaped. Then looks at you. She says nothing. She does not need to. The remaining captor lies wounded nearby. Alive. You drag him upright and demand to know where the others are. Fear wins quickly.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Captor 3</span><span class="dialogue-line">“C-camp. I'll lead you. Just...”</span></div>
<p>He points. Then his face changes. The escaped man is heading there too. With warning. You move immediately.</p>
<</if>>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_09">><</button>>
</div><<silently>><<set _resolution = $questFlags.q_wildling_second_resolution>><<if _resolution is "str_failure">><<run setup.wildlingSecondQuest.applyPopulationLoss()>><</if>><</silently>>
<div class="hub-textbox">
<<if _resolution is "follow">>
<p>Following them was the right decision. The camp below has no idea you are there. More importantly, you know exactly where your people are. Your hunter is dragged into the center and tied beside the other two. All three are alive. Bruised. Exhausted. But alive. You take in the rest of the camp. A handful of crude shelters crowd beneath a rocky rise. Spears lean against timber. Meat hangs over one smoking fire. Just under a dozen people in total. No women.</p>
<p>No children. Calling them a tribe would be too generous. They live by theft, captives, and whatever they can tear from weaker groups. Reavers. Small enough to disappear into the wilderness when threatened. Large enough to prey on anyone weaker than themselves. You glance toward <<print $wildlingName>>. She isn't looking at them. She's looking at the camp. A man near the central fire appears to be in charge. He watches your hunter being dragged in with little interest, leaning lazily against a spear.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Hm? You boys found someone?”</span></div>
<p>One of the captors shoves your hunter forward. The chief gives him a slow look.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Put him with the other two. I'll question him in a bit.”</span></div>
<p>A smile pulls at one side of his mouth.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Maybe this one will be more... cooperative.”</span></div>
<p>Your hunter clearly doesn't understand the words. Judging by his expression, he understands the smile well enough, though. While the reavers settle back into their camp, <<print $wildlingName>>'s attention moves elsewhere. The paths between the shelters. The spears resting beside one fire. The men moving back and forth. Then the trees around you. Her eyes settle on a hanging branch. A vine. A narrow stretch of ground between two rocks. <<print $wildlingName>> looks at you and points downward. Wait.</p>
<p>Then she disappears into the brush. You remain where you are. For several minutes, very little seems to happen. A vine shifts. A branch bends. Something disappears beneath loose leaves. <<print $wildlingName>> moves from one point to another, fingers working quickly in the darkness. Cord. Knots. Tension. Leverage. You recognize the method.</p>
<p>You have seen her work before. Last time, you happened to be the target. Accidentally. At the time, her trap had managed little more than scratching you. Watching her now, you are beginning to suspect that said rather more about you than it did about the trap. She returns to your side with dirt beneath her nails and a pleased little look on her face. Then she waits. So do you. Eventually one of the reavers moves. His foot catches something hidden beneath the leaves. A cord snaps tight. The result is considerably more impressive when the person caught in it is normal.</p>
<p>The man's leg vanishes out from beneath him. He hits the ground hard enough to lose his breath. At the same instant, tension releases somewhere above. A bent branch whips free. Wood cracks against another reaver's shoulder and sends him spinning into the dirt. Someone shouts. Another man rushes toward them. His foot finds a second line. This one does not pull upward. It pulls sideways. He is ripped off balance and crashes into a stacked rack of spears, sending stone, wood, and frightened curses across the camp. Panic spreads almost immediately.</p>
<p>Nobody knows where the attack is coming from. Nobody knows how many attackers there are. The chief straightens sharply.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“What the fuck is happening?!”</span></div>
<p>More importantly, nobody is looking at the prisoners. <<print $wildlingName>> glances at you. Now. You descend quickly. The first reaver still standing barely has time to turn. You put him down with a twist of his neck. Another reaches for a weapon. <<print $wildlingName>> appears from behind one of the shelters and drives a stone knife into him before his fingers manage to close around it. A third lunges toward your hunters, knife already in hand. He makes it two steps. Something tightens around his ankle. He is yanked backward with a yell.</p>
<p><<print $wildlingName>> looks toward you. Smug. Very smug. Seeing it now, you almost feel bad for how little reaction you gave the first trap of hers that caught you. Almost. The rest is brief. By the time the camp understands what has happened, all three hunters are free. Your loud companion rubs his wrists.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“I knew you were following.”</span></div>
<p>You look at him. He hesitates.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter</span><span class="dialogue-line">“...Eventually.”</span></div>
<p>One of the rescued hunters laughs despite the swelling around his eye. A shout cuts through it. The reaver chief is still standing. Barely. One side of his face is bloodied, but somehow anger is carrying him where sense no longer will. His hands tighten around his spear.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“You think you can just walk into my camp?!”</span></div>
<p>You look around. One man hanging upside down from a snare. Another bleeding into the dirt. Several bodies. Your hunters already free. Apparently so. The chief roars and charges. You lift one foot. Slowly. Unhurried. He thrusts. You bring your foot down on the spear shaft.</p>
<p>The stone point bites into the dirt. He pulls. Nothing. He pulls harder. The spear does not move. Confusion slowly replaces fury. Finally, he looks up. You smile. . . . <<print $wildlingName>> watches him hit the ground.</p>
<p>Then looks at you. A small approving sound escapes her. Around you, the little reaver camp has ceased resisting. <<print $wildlingName>> crouches beside one of her sprung traps. She prods the cord. Checks the knot. Frowns at something only she seems dissatisfied with. Apparently, their performance could still be improved. You look around the camp. Personally, you don't see much to complain about. You came looking for three hunters. You found three hunters.</p>
<<elseif _resolution is "str_success">>
<p>The captive leads quickly. Fear makes for an excellent motivator. Before long, firelight appears through the trees. A small camp. Just under a dozen people. And tied near the center are the two hunters you came looking for. Alive. Captor 3 starts to shout. <<print $wildlingName>>'s hand closes over his mouth before the first sound properly leaves it. You look at her. She looks pleased with herself. You tell her to stay here and keep him quiet.</p>
<p>Then you step out of the trees. Alone. Unarmed. You don't sneak. You don't hurry. You simply walk into the camp. The first few reavers who notice you tense immediately. Hands move toward weapons. Eyes search the trees behind you. Nothing. No warriors. No ambush.</p>
<p>Just you. The alarm in their faces eases slightly. A man near the central fire rises with a decorated spear in his hand. He looks you over.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“And who the fuck are you?”</span></div>
<p>You don't answer. Instead, your attention moves past him. Toward your hunters. Bruised. Bound. YOUR men. Taken without permission. The chief follows your gaze. Then smiles.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Aah.”</span></div>
<p>He rests the spear against his shoulder.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“You must be the third one. The one who got away.”</span></div>
<p>His smile widens.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Perfect. I was getting bored of these two.”</span></div>
<p>He jerks his chin toward the prisoners.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Wouldn't give me anything useful.”</span></div>
<p>He takes a step closer.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Maybe we'll get along better.”</span></div>
<p>Another.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“Just tell me where your tribe is.”</span></div>
<p>Hm. That means they didn't talk. Good. You ignore him and look around the camp instead. One near the fire. Two beside the shelters. Another leaning against a post. You continue counting silently. The chief's smile fades.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Reaver Chief</span><span class="dialogue-line">“What the fuck are you looking at?”</span></div>
<p>You return your attention to him. And smile. . . . The camp is considerably quieter when you are finished. Three bodies lie still around the fire. A fourth man writhes in the dirt, screaming and clutching at the stump of his arm. You are still holding the missing piece. His hand remains locked around the decorated spear. You look at it. Then at him.</p>
<p>With a sigh, you toss both aside. The spear lands in the dirt several paces away. You glance back toward the trees and make a short gesture. <<print $wildlingName>> emerges a moment later, still dragging Captor 3 with her. The captive takes one look at the camp. At the bodies. At the screaming man. Then very carefully stops struggling. You point toward the wounded reaver. Then give <<print $wildlingName>> a simple order. End the noise. She understands immediately.</p>
<p>Good. She followed the order without hesitation. You turn away before the screaming stops. Your loud hunter is already moving toward the prisoners. You tell him to free them. What follows is brief. By the end of it, both prisoners are loose. One of them stares at you as you tear through the last of his bindings.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“Chief?”</span></div>
<p>You nod. That seems to be enough. Dagan appears behind you, rubbing at the marks around his wrists.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Dagan</span><span class="dialogue-line">“Told you he'd come.”</span></div>
<p>Hunter 2 looks at him.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“You were captured too, Dagan.”</span></div>
<p>Dagan pauses.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Dagan</span><span class="dialogue-line">“Not important.”</span></div>
<p>You came looking for three hunters. You found three hunters.</p>
<<else>>
<p>You move quickly. Still, you don't make it in time. By the time firelight appears through the trees, something is wrong. The camp is quiet. Too quiet. No voices. No movement between the shelters. No weapons being gathered. Nothing. The man who escaped you arrived first. Your hunter sees it too. His face goes pale.</p>
<p>You shove your captive forward and descend into the camp. He shakes as he walks. Whatever awaits him now, he seems to have a fairly good idea who you will blame for what you are about to find. Abandoned. A cooking fire still burns. Meat hangs forgotten above it. A spear lies in the dirt beside one of the shelters. Whatever was worth carrying was taken. Whatever was not was left behind. They fled in a hurry. You reach the center. Two posts.</p>
<p>Two bodies. The missing hunters are still bound. Their throats have been opened. One recently enough that blood still runs dark down his chest. The warning reached the camp before you did. It seems the reavers had no desire to drag their prisoners along while fleeing. Leaving them alive was a risk they were unwilling to take. Behind you, your hunter stops. For once, he says nothing. Your captive has gone still as well. What becomes of him afterward is less certain. Perhaps you let him run. Perhaps he never leaves the camp. <<print $wildlingName>> looks over the scene, her expression giving little away.</p>
<p>What you feel at the sight of it is known only to you. Apathy. Anger. Sadness. Perhaps something else entirely. You look toward the trees. They ran. Far enough, perhaps, to survive. Still, you doubt they will make the mistake of touching what is yours again any time soon. One of them already knows what happened when four of their number tried. Soon the rest will know too. Perhaps the next time they see one of your hunters alone in the woods, they will remember.</p>
<p>Perhaps they will decide there are easier things to steal. It is poor consolation. But it is something. You found the missing hunters. Just not in time.</p>
<div class="result-list"><div class="result-line bad"><span class="label">Population</span><span class="value">-2</span></div></div>
<</if>>
</div>
<div class="hub-buttons">
<<button "Continue" "Quest_WildlingSecond_10">><</button>>
</div><<silently>><<set _dead = $questFlags.q_wildling_second_resolution is "str_failure">><<run setup.wildlingSecondQuest.completeQuest()>><</silently>>
<div class="hub-textbox">
<<if _dead>>
<p>Dawn finds you on the trail home. One hunter walks behind you. Quiet, for once. One of the bodies is carried across his shoulders as well as he can manage. You carry the other. Neither burden is particularly difficult for you. The same cannot be said for him. Still, he does not complain. The soft creak of wrapped hide and carrying straps follows you through the trees. <<print $wildlingName>> walks beside you. Her eyes drift toward the bodies once or twice. Then back to the trail.</p>
<p>There will be graves to dig when you return. People to tell. Questions to answer. For most of the journey, neither you nor <<print $wildlingName>> says much. There is little that needs saying. Something feels different between the two of you now. Not entirely new. Perhaps simply harder to ignore than it was before. Whether that means she has drawn closer to you, or simply grown accustomed to being kept close to you, is harder to say. <<print $wildlingName>> glances toward you. You catch her doing it. She holds your gaze for a moment before slowly looking back toward the path ahead.</p>
<p>For now, she remains beside you. Behind you, your surviving hunter carries one of his dead companions home. The other rests in your arms. Ahead, smoke from your camp rises above the trees. The expedition is over. What comes next, only time will tell.</p>
<<else>>
<p>Dawn finds you on the trail home. Three hunters walk behind you. Bruised. Hungry. One limps badly enough that the others occasionally have to slow for him. But all three are alive. Their voices drift through the trees from time to time. Mostly complaints. Occasionally laughter. Your loud hunter appears to have recovered enough to begin retelling his capture already. You stop listening after a while, your thoughts drifting elsewhere. <<print $wildlingName>> walks beside you.</p>
<p>For most of the journey, neither of you says much. There is little that needs saying. Something feels different between the two of you now. Not entirely new. Perhaps simply harder to ignore than it was before. Whether that means she has drawn closer to you, or simply grown accustomed to being kept close to you, is harder to say. <<print $wildlingName>> glances toward you. You catch her doing it. She holds your gaze for a moment before slowly looking back toward the path ahead. For now, she remains beside you. Ahead, smoke from your camp rises above the trees. The expedition is over. What comes next, only time will tell.</p>
<</if>>
<div class="result-list">
<<if $questFlags.q_wildling_second_tactical_wisdom_applied>>
<div class="result-line good"><span class="label" style="white-space:nowrap;font-size:12px;letter-spacing:.01em;"><<print $wildlingName>> Stats Improved</span><span class="value">+2 Wisdom</span></div>
<</if>>
<div class="result-line good"><span class="label">Task</span><span class="value">Completed</span></div>
</div>
</div>
<div class="hub-buttons">
<<button "Return to camp" "Hub_1">><</button>>
</div><<silently>>
/* ===========================
RESOLVE QUEST: The Wildling (always completes) =========================== */
<<set _qid = "q_wildling_01">>
<<set _choice = String($q_wildling_choice ?? "")>>
/* store choice (optional) */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if _choice>>
<<set $questFlags["q_wildling_01_choice"] = _choice>>
<</if>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* mark complete + hide marker */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>>
<<set $questFlags[_qid + "_done"] = true>>
<<set $q_wildling_01_resolvedTurn = $turn>>
<<set $q_wildling_01_resolvedChoice = _choice>>
<<set $questFlags.q_wildling_01_saved = (_choice is "intervene")>>
<<if _choice is "intervene" and setup.hubScenes.registerRecentEvent("wildling_arrival", $turn, 2)>>
<<run setup.hubScenes.invalidate("wildling_arrival")>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _choice is "intervene">>
<p>You step out from the brush and walk toward them.</p>
<p>There is nothing hurried in the way you move, yet the distance disappears faster than either hunter expects.</p>
<p>The man holding her down notices you first. He turns just enough to begin a confused sound.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 2</span><span class="dialogue-line">“Hu-”</span></div>
<p>Your strike cuts it off.</p>
<p>His head snaps sideways and his body collapses away from her.</p>
<p>The second hunter jerks upright, panic and outrage arriving at the same time.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">Hunter 1</span><span class="dialogue-line">“Wh- what the fuck do you think you're doin-”</span></div>
<p>He never finishes.</p>
<p>The wild woman is already moving.</p>
<p>The instant the weight leaves her back, she surges forward on hands and feet and throws herself into him. She does not search for a weapon. She drags him down and goes for his throat.</p>
<p>Her teeth sink in.</p>
<p>The man screams once before the sound collapses into a wet choke. She holds on, shaking her head until his hands stop finding anything useful to grab.</p>
<p>Even then she does not stop immediately.</p>
<p>She finds a rock and brings it down against him again and again with all the fury she could not spend while pinned beneath them.</p>
<<if $questFlags and $questFlags.q_wildling_01_watched>>
<p>At first you assume she is simply making certain he is dead.</p>
<p>Then the blows continue after certainty is no longer necessary.</p>
<p>The body stops moving. She does not.</p>
<p>For a moment the violence feels less like the end of this fight than years of fear and rage finally finding something they are allowed to strike.</p>
<p>An uncomfortable thought follows.</p>
<p>You stood by long enough to let part of this happen.</p>
<p>Whatever the delay changed in her, some share of it belongs to you.</p>
<</if>>
<p>Eventually her arm slows.</p>
<p>She rises with difficulty, breathing hard. Blood is smeared across her mouth and chin. She makes no attempt to cover herself. Survival has left little room for modesty.</p>
<p>Her eyes settle on you.</p>
<p>For a few seconds she tries to rebuild the same hard guard you saw when she first trapped you. Exhaustion wins before she manages it.</p>
<p>You say nothing.</p>
<p>You hold out a hand.</p>
<p>She studies it for a long time, eyes moving from your fingers to your face as though weighing every possible meaning behind the gesture.</p>
<p>Then she steps closer.</p>
<p>Once. Then again.</p>
<p>Finally she puts her hand in yours.</p>
<p>The grip is weak, but the decision is deliberate.</p>
<p>A moment later her knees buckle.</p>
<p>You catch her before she reaches the ground. By the time you look down, her eyes are already closing.</p>
<p>She has passed out.</p>
<p>There is little choice but to carry her back. You lift her and turn toward camp, leaving the two hunters where they fell.</p>
<<silently>>
/* Love gain:
- normal: +20 - if "watched" flag was activated earlier: +10
*/
<<run (function () {
const V = SugarCube.State.variables;
const watched = !!(V.questFlags && (V.questFlags.q_wildling_01_watched || V.questFlags["q_wildling_01_watched"]));
const gain = watched ? 10 : 20;
/* store for later application when she actually joins camp */
V.q_wildling_savedLoveGain = gain;
V.q_wildling_loveGain = gain;
})();>>
/* ===========================
NPC Tribe 1 loses 2 population (real effect) =========================== */
<<set _tribeId = "npc_camp_1">>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tribeId) : null>>
<<set _tribeName = (_t && _t.name) ? _t.name : "NPC Tribe 1">>
<<set _popLoss = 2>>
<<set _enemyPops = Math.max(0, Number(_t?.stats?.population ?? 0))>>
<<set _actualLoss = Math.min(_enemyPops, _popLoss)>>
<<if _t>>
<<set _t.stats.population = Math.max(0, _enemyPops - _actualLoss)>>
<<run if (setup.tribes && setup.tribes.recalcDerived) setup.tribes.recalcDerived(_t);>>
<</if>>
<</silently>>
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $q_wildling_loveGain>></span>
</div>
<div class="result-line bad">
<span class="label"><<print _tribeName>> population</span>
<span class="value">-<<print _actualLoss>></span>
</div>
</div>
<<elseif _choice is "leave">>
<p>You do nothing.</p>
<p>Whether you consider this the consequence of her choices or simply decide that none of it concerns you, the result is the same. You do not move to stop the men.</p>
<p>The world they inhabit has taught them that strength can be mistaken for permission, and they have no reason to believe anyone nearby will challenge them.</p>
<p>The woman keeps fighting until the trees hide the scene from you.</p>
<p>A curse. Another blow. The sound of struggling bodies moving deeper into the forest.</p>
<p>Then even that fades with distance.</p>
<p>You return to camp without her.</p>
<p>In the days that follow, you find no new sign of the wild woman. No hiss from the brush. No cord snapping tight around an ankle. No eyes following you from between the trees.</p>
<p>Whatever happens to her after that day, you do not see her again.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
<p>Something has gone wrong. The quest reached resolution without a valid choice.</p>
<div class="result-list">
<div class="result-line bad">
<span class="label">Task</span>
<span class="value">Error</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if $questFlags and $questFlags.q_wildling_lake_root_taken>><<goto "Hub_1">><</if>>
<<set $energy = Math.max(0, Number($energy ?? 0) - 1)>>
<<run setup.wildHeart.createLakeQuest()>>
<<set _dc = 5>>
<<set _roll = random(1, 20)>>
<<set _stat = setup.player.getStatForCheck("wisdom")>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<set _granted = false>>
<<set $questLastCheck = {
ok:_ok,
statKey:"wisdom",
stat:_stat,
dc:_dc,
roll:_roll,
total:_total
}>>
<<if _ok>>
<<set _granted = (setup.wildHeart.grantRootCluster() ? true : false)>>
<<run setup.wildHeart.setLakeCraftObjective()>>
<</if>>
<</silently>>
''<div class="hub-textbox">
-1 Energy
After having your men scout the lakeshore for several days, you finally find a stretch of bank that might hold what you need. Even so, your hunters have trouble spotting it on their own, so in the end you join the search yourself.
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASSED</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAILED</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<div class="result-line">
<span class="label">Check total</span>
<span class="value"><<print $questLastCheck.total>> (<<print $questLastCheck.stat>> + <<print $questLastCheck.roll>>)</span>
</div>
<div class="result-line bad">
<span class="label">Energy</span>
<span class="value">-1</span>
</div>
<<if _granted>>
<div class="result-line good">
<span class="label">Quest item</span>
<span class="value">Root Cluster</span>
</div>
<div class="result-line good">
<span class="label">Quest updated</span>
<span class="value">Craft the poultice</span>
</div>
<</if>>
</div>
<<if $questLastCheck.ok>>
At last, after a long search, something catches your eye.
It is hidden among the reeds and low growth, plain enough that you might have overlooked it a dozen times already. At first glance it seems no different from the other plants around it, but Morag had been clear: this was the one.
And now, finally, you have it.
All that remains is to return to camp and have the poultice prepared.
<<else>>
But despite your best efforts, and the time spent searching day after day, you still come up empty-handed. All you are left with is wasted time and growing doubt.
Perhaps you were wrong. Perhaps the roots are not here after all.
You will need to try again.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
<<set _kaelPresent = false>>
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is "npc_kael">>
<<set _kaelPresent = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>''<div class="hub-textbox">
You stand once more within sight of the hidden caves, the river and hanging growth doing their best to make the place seem less real than it is.
<<if _kaelPresent>>
Kael waits beside you with the same calm expression he wore before, though his eyes stay on the largest entrance.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Well,</span>
<span class="dialogue-bridge">He says at last.</span>
<span class="dialogue-line">We know enough now. The only question is how you want to proceed.</span>
</div>
<</if>>
The men you brought wait farther back among the trees, ready if you mean to use them.
How will you deal with the cave tribe?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Lead an attack with your hunters</span>">>
<<set $kaelCaveTribeApproach = "attack">>
<<goto "Quest_q_kael_cave_tribe_attack_01">>
<</button>>
<<button "<span class='choice-text'>Leave them</span>">>
<<set $kaelCaveTribeApproach = "leave">>
<<goto "Quest_q_kael_cave_tribe_leave">>
<</button>>
</div><<silently>><<run setup.playBattleSceneTrack ? setup.playBattleSceneTrack() : (setup.playBattle ? setup.playBattle() : null)>><</silently>>''<div class="hub-textbox">
You signal for the waiting hunters to close in.
Men move through the undergrowth at your command, quiet at first, each of them watching the dark cave mouth with the tense focus of someone who already expects blood.
Kael steps up beside you and gives a short nod.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Then we do this properly,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">Fast. Hard. Before they understand what is happening.</span>
</div>
You nod and look towards the caves
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>The attack begins</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_02">>
<</button>>
</div>''<div class="hub-textbox">
You approach the cave with your men ready behind you, weapons in hand and nerves drawn tight.
<<silently>>
<<set _entryDc = 13>>
<<set _entryRoll = random(1, 20)>>
<<set _entryStat = setup.player.getStatForCheck("leadership")>>
<<set _entryTotal = _entryStat + _entryRoll>>
<<set _entrySuccess = (_entryTotal >= _entryDc)>>
<<set $kaelCaveAttackEntryCheck = {
ok: _entrySuccess,
statKey: "Leadership",
stat: _entryStat,
roll: _entryRoll,
dc: _entryDc,
total: _entryTotal
}>>
<<set _entryLoss = 0>>
<<if not _entrySuccess>>
<<set _entryLoss = 2>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _entryLoss)>>
<</if>>
<<set $kaelCaveAttackEntryLoss = _entryLoss>>
<</silently>>
<div class="result-list">
<<if $kaelCaveAttackEntryCheck.ok>>
<div class="result-line good">
<span class="label">Leadership check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Leadership check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Leadership + d20 vs DC</span>
<span class="value"><<print $kaelCaveAttackEntryCheck.total>> / <<print $kaelCaveAttackEntryCheck.dc>></span>
</div>
<<if $kaelCaveAttackEntryLoss > 0>>
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-<<print $kaelCaveAttackEntryLoss>></span>
</div>
<</if>>
</div>
<<if $kaelCaveAttackEntryCheck.ok>>
It does not take long to notice that the caves are far quieter than they were the last time you were here.
You begin directing your men with simple hand signals, keeping your voice low and your movements sharp. One group moves toward the main entrance with you, while the others spread out in pairs toward the smaller side passages.
The silence does not last.
A clash rings out from somewhere deeper within the stone.
Then another.
For a moment, it seems as though some of the tribe mean to fall back into the side tunnels and circle around behind you, but your men are already there waiting. The would-be ambushers are caught before they can turn the caves against you.
You press forward.
<<else>>
It does not take long to notice that the caves are far quieter than they were the last time you were here.
You move your men forward, many and strong, but it quickly becomes clear that numbers alone mean little in a place like this. The darkness shifts around every step. Narrow passages twist into one another. Shapes move at the edge of sight, and for a few dangerous moments it becomes difficult to tell friend from foe.
Then comes the first strike.
The snap of a bowstring.
A spear thrust from the side.
Your senses are sharp enough to catch the ambushers quickly, and your men do answer with force—but not before blood is spilled. The cave tribe knows this ground better than you do, and in the opening moments of the assault, that knowledge costs you men.
Still, the attack does not falter.
You drive onward.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_03">>
<</button>>
</div>''<div class="hub-textbox">
As you move deeper into the cave, it becomes clear that the danger here is not only the stone, the darkness, or the hidden traps.
Your men, for all their effort, seem to be losing focus.
Even with weapons in hand and tension in their limbs, their minds begin to drift, tugged elsewhere by the sounds, scents, and strange atmosphere of the place.
<<silently>>
<<set _deepDc = 15>>
<<set _deepRoll = random(1, 20)>>
<<set _deepStat = setup.player.getStatForCheck("leadership")>>
<<set _deepTotal = _deepStat + _deepRoll>>
<<set _deepSuccess = (_deepTotal >= _deepDc)>>
<<set $kaelCaveAttackDeepCheck = {
ok: _deepSuccess,
statKey: "Leadership",
stat: _deepStat,
roll: _deepRoll,
dc: _deepDc,
total: _deepTotal
}>>
<<set _deepLoss = 0>>
<<if not _deepSuccess>>
<<set _deepLoss = 1>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _deepLoss)>>
<</if>>
<<set $kaelCaveAttackDeepLoss = _deepLoss>>
<</silently>>
<div class="result-list">
<<if $kaelCaveAttackDeepCheck.ok>>
<div class="result-line good">
<span class="label">Leadership check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Leadership check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Leadership + d20 vs DC</span>
<span class="value"><<print $kaelCaveAttackDeepCheck.total>> / <<print $kaelCaveAttackDeepCheck.dc>></span>
</div>
<<if $kaelCaveAttackDeepLoss > 0>>
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-<<print $kaelCaveAttackDeepLoss>></span>
</div>
<</if>>
</div>
<<if $kaelCaveAttackDeepCheck.ok>>
Yet you remain focused, and that is enough.
You keep your men moving with sharp gestures and hard looks, herding them through the tunnels like a wary shepherd guiding a flock through wolf-country. Again and again, you spot the signs of danger before your men stumble into them: a stretched cord, a loosened stone, a patch of ground too carefully disturbed.
Trap after trap is avoided.
It does not take long before you finally reach the great chamber ahead—the largest space in the cave, and almost certainly the place where the bulk of the tribe has gathered.
And so, with your men behind you, you enter.
<<else>>
Even you lose focus for a moment.
Your foot catches a trap hidden beneath the ground. It bites into you and draws blood before your flesh knits itself back together as you shake off the pain and keep moving.
Your men are not capable of the same.
With every stretch of cave you force your way through, another cry rings out—a yelp, a curse, a scream of pain as hidden traps claim flesh, balance, and blood. Then, at last, one of them claims more than that.
A hunter dies.
Still, you press on.
At length, you find yourself standing before the great chamber ahead, the largest room in the cave, and almost certainly the place where the bulk of the tribe has gathered.
And so, with your battered men behind you, you enter.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Enter</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_04">>
<</button>>
</div>''<div class="hub-textbox">
You find yourself standing before the tribe at last.
There are perhaps fifty of them—mostly women, though some men are scattered among them as well. At their center stands their leader, the same woman you saw before. She faces you boldly, seemingly untroubled by the armed men at your back.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">So,</span>
<span class="dialogue-bridge">She says, her voice calm, almost amused.</span>
<span class="dialogue-line">it was your people causing all that noise?</span>
</div>
Her eyes move over you, then briefly over the hunters behind you.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">If you had announced yourselves, we might even have welcomed you. Instead, you come crashing into our home with spears in hand.</span>
</div>
A faint smile touches her lips.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Why is that, stranger?</span>
</div>
Your reasons, whatever they may truly be, are yours alone.
But one thing remains clear enough.
They are keeping something that does not belong to them.
You lift a hand and point toward the two men lying sprawled deeper in the chamber—thinner than they should be, still slack and unmoving, seemingly unable to wake even during the chaos of your assault.
The woman’s gaze follows your gesture.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Ah,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">Those two. So that is what this is about.</span>
</div>
She gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">You could have simply asked for them. It is not as though we keep them in chains. They stayed of their own accord.</span>
</div>
Her eyes flick briefly toward the scouts before returning to you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">We were merely being... accommodating.</span>
</div>
<<if $kaelScoutsWisdomPassed or $kaelScoutsGhostwalkSeen>>
You do not let the half-truth pass unchallenged.
You point out that words like ''could leave'' mean very little in the state those men are in. Whatever they have been drinking, whatever has been poured into them, choice is hardly part of it any longer.
One of her eyebrows lifts slightly, and for the first time she seems genuinely surprised.
Then she smiles.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Did you visit us before, unknown face?</span>
<span class="dialogue-bridge">She asks.</span>
<span class="dialogue-line">I would find it very strange if I had somehow forgotten a handsome man like you.</span>
</div>
<</if>>
At last, she lets out a slow breath.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Very well,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">If you want them back, take them.</span>
</div>
Her tone remains maddeningly composed.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Or is that not enough? Do you want compensation for your troubles? Or will only blood satisfy this insult?</span>
</div>
She spreads her hands lightly at her sides, as though indulging you.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Well?</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Take your men and leave</span>">>
<<set $kaelCaveTribeDemand = "take_men">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<<button "<span class='choice-text'>Demand blood</span>">>
<<set $kaelCaveTribeDemand = "blood">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<<if $kaelScoutsWisdomPassed or $kaelScoutsGhostwalkSeen>>
<<button "<span class='choice-text'>Demand compensation</span>">>
<<set $kaelCaveTribeDemand = "compensation">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<</if>>
</div>''<div class="hub-textbox">
<<if $kaelCaveTribeDemand is "blood">>
<<silently>>
<<set _bloodDc = 13>>
<<set _bloodRoll = random(1, 20)>>
<<set _bloodStat = setup.player.getStatForCheck("endurance")>>
<<set _bloodTotal = _bloodStat + _bloodRoll>>
<<set _bloodSuccess = (_bloodTotal >= _bloodDc)>>
<<set $kaelCaveTribeBloodCheck = {
ok: _bloodSuccess,
statKey: "Endurance",
stat: _bloodStat,
roll: _bloodRoll,
dc: _bloodDc,
total: _bloodTotal
}>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "blood", popGain: 20, sapQty: 3, destroyTribe: true })>>
<</silently>>
You do not bother answering with words.
You simply raise your hand...
...and bring it down.
Your men know what it means, and they do not hesitate.
They surge forward at once.
There is resistance, of course, but with you there, it is negligible. Some of the tribe try to flee. Others try to fight. Neither ends well for them.
One of those who resists is the woman herself.
Aífe.
With surprising speed, she slips past one of your men and lunges straight for you. You do not see where she draws it from, but suddenly a stone knife, far sharper than such a thing has any right to be, flashes in her hand and drives for your neck.
<div class="result-list">
<<if $kaelCaveTribeBloodCheck.ok>>
<div class="result-line good">
<span class="label">Endurance check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Endurance check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $kaelCaveTribeBloodCheck.total>> / <<print $kaelCaveTribeBloodCheck.dc>></span>
</div>
</div>
<<if $kaelCaveTribeBloodCheck.ok>>
Yet it does not pierce.
It cannot.
The blade presses against your flesh and stops there, refusing to go any farther.
For a single moment, your eyes meet hers.
<<else>>
The knife lands.
It bites into your neck, not deep enough to kill outright, but more than enough to at the very least cripple any normal man. Pain flares through you, sharp and immediate, forcing your head to tilt with the impact.
It hurts.
But it is not enough.
You straighten again, fix your gaze on her, then calmly seize her wrist and force the blade back out. Even as her eyes remain locked on yours, the wound is already beginning to close before her.
<<set $endurance = Math.max(0, Number($endurance || 0) - 1)>>
<</if>>
Something flashes in her eyes for a moment.
Surprise, perhaps.
Then acceptance.
Perhaps even the faintest trace of amusement.
And then one of your men drives a spear through her.
She falls.
As the light leaves her eyes, she keeps looking at you, through you, almost. Even at the end, you do not think you saw fear there.
At last, you turn your attention to what remains.
The living. The dying. The dead.
You give another signal, and your men begin rounding up the survivors while the two lost scouts are dragged free from the chamber. Then, without ceremony, you begin the march back to camp.
Your task is complete.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+20</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+3 Machi Sap</span>
</div>
<div class="result-line neutral">
<span class="label">Outcome</span>
<span class="value">Machi Tribe destroyed</span>
</div>
</div>
<</if>>
<<if $kaelCaveTribeDemand is "take_men">>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "take_men", popGain: 2, sapQty: 1, unlockTribe: true, relations: 12 })>>
You look at her for a moment, then take a slow breath before answering.
<div class="dialogue-inset">
<span class="dialogue-speaker">$user</span>
<span class="dialogue-line">You will return my men,</span>
<span class="dialogue-bridge">You say.</span>
<span class="dialogue-line">And you will not do something like this again.</span>
</div>
For a brief moment, the woman simply studies you.
Then she smiles, clearly pleased with your answer.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Of course, strange face,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">But to let you leave with nothing at all would be rude. After all... you worked so hard.</span>
</div>
She turns her head slightly.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Girls.</span>
</div>
At once, two of the tribe’s women hurry off toward a smaller side chamber. A moment later, they return carrying a wide bowl filled with a thick purple mixture, its scent strong enough to reach you even from a short distance away.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Please,</span>
<span class="dialogue-bridge">She says, gesturing lightly toward it.</span>
<span class="dialogue-line">take this as a sign that bygones should remain bygones.</span>
</div>
Her smile deepens just a little.
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">And if you happen to like it... we would always be willing to trade more. Send someone for it, and perhaps an arrangement could be made.</span>
</div>
Then, after the briefest pause, she adds:
<div class="dialogue-inset">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Though I would prefer it if you came to do the negotiating yourself, strange face.</span>
</div>
She gives you a small wink.
You take the bowl and hand it off to one of your men to carry with care, while the others move to retrieve the missing scouts.
As you turn to leave, her voice follows after you—calm as ever.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">The Cave Leader</span>
<span class="dialogue-line">Be sure to visit again soon.</span>
</div>
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+1 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
</div>
<</if>>
<<if $kaelCaveTribeDemand is "compensation">>
<<silently>>
<<set _compDc = 13>>
<<set _compRoll = random(1, 20)>>
<<set _compStat = setup.player.getStatForCheck("stewardship")>>
<<set _compTotal = _compStat + _compRoll>>
<<set _compSuccess = (_compTotal >= _compDc)>>
<<set _compTribute = _compSuccess ? 2 : 1>>
<<set $kaelCaveTribeCompCheck = {
ok: _compSuccess,
statKey: "Stewardship",
stat: _compStat,
roll: _compRoll,
dc: _compDc,
total: _compTotal
}>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "compensation", popGain: 2, sapQty: _compTribute, unlockTribe: true, relations: -18, tributeQty: _compTribute })>>
<</silently>>
You lay it out simply.
They took something that was yours, and in turn, you will take something that is theirs.
They will pay tribute—regularly—granting you a steady supply of the drink they fed to your men.
Aífe watches you in silence for a long moment before letting out a slow, measured sigh.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">Very well,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">It is not as though we have much room to negotiate.</span>
</div>
Her tone remains calm, though less amused than before.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">You may send someone to collect the sap every 15 moons. It is difficult to make, and we still require some for ourselves.</span>
</div>
<div class="result-list">
<<if $kaelCaveTribeCompCheck.ok>>
<div class="result-line good">
<span class="label">Stewardship check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Stewardship check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Stewardship + d20 vs DC</span>
<span class="value"><<print $kaelCaveTribeCompCheck.total>> / <<print $kaelCaveTribeCompCheck.dc>></span>
</div>
</div>
<<if $kaelCaveTribeCompCheck.ok>>
You do not answer immediately.
Instead, you raise your hand and hold up two fingers.
For the first time, real irritation touches her face.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">I already told you,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">we cannot spare more than one. If we give away too much—</span>
</div>
You interrupt her by striking your foot sharply against the stone, then slowly begin to raise a third finger.
She stares at you for a moment, then exhales through her nose in visible frustration.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">Fine,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">Fine. You will have two.</span>
</div>
Her eyes narrow.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">Will that be all, or do you want the skin off our backs as well?</span>
</div>
You do not bother replying. Instead, you gesture for your men to collect what is owed, retrieve the scouts, and prepare to leave.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+2 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">Tribute secured</span>
<span class="value">2 Machi Sap every 15 turns</span>
</div>
<div class="result-line neutral">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
<div class="result-line bad">
<span class="label">Relations worsened</span>
<span class="value">They will remember the coercion</span>
</div>
</div>
<<else>>
You hold her gaze, but do not press further.
Better a steady tribute than forcing the matter until it breaks.
Aífe seems to sense the decision at once.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífe</span>
<span class="dialogue-line">Good,</span>
<span class="dialogue-bridge">She says.</span>
<span class="dialogue-line">Then we understand one another.</span>
</div>
You have your men collect what has been offered, retrieve the missing scouts, and prepare to leave.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+1 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">Tribute secured</span>
<span class="value">1 Machi Sap every 15 turns</span>
</div>
<div class="result-line neutral">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
<div class="result-line bad">
<span class="label">Relations worsened</span>
<span class="value">They yield, but grudgingly</span>
</div>
</div>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : null>>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "leave" })>>
<</silently>>''<div class="hub-textbox">
You stand there for a moment longer, listening to the muffled life inside the caves and the uneasy breathing of the hunters waiting behind you.
Whatever took the missing scouts, it is still in there. So is the tribe that sheltered them.
But today, you choose not to force the matter.
The order goes out quietly. Your hunters pull back into the trees, and the hidden caves are left undisturbed.
<div class="result-list">
<div class="result-line bad">
<span class="label">Quest failed</span>
<span class="value">You left the cave tribe alone</span>
</div>
<div class="result-line bad">
<span class="label">Scouts abandoned</span>
<span class="value">The missing scouts were not recovered</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_kael_missing_scouts_01">>
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Missing Scouts">>
<<set $quests[_qIndex].desc = "Eogan has returned from the river search with word that unknown people were stalking Kael's scouts from the brush. The search is no longer only about the missing men.">>
<<set $quests[_qIndex].objective = "Use Expedition from camp to investigate the hidden group watching the river search.">>
<<set $quests[_qIndex].status = "active">>
<<set $quests[_qIndex].targetX = $campX>>
<<set $quests[_qIndex].targetY = $campY>>
<<set $quests[_qIndex].markerRevealed = true>>
<<set $quests[_qIndex].expeditionPassage = "Quest_q_kael_missing_scouts_01">>
<</if>>
<<set $questFlags["q_kael_missing_scouts_01_arrival_seen"] = true>>
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
At Kael’s urging, you have your hunters spread into smaller groups to cover more ground. You will keep searching for a few more days, and if no tracks turn up…
…you will assume the worst.
One day passes. Nothing.
Two days pass. Still no sign of them.
On the third, while you and Kael are discussing other matters inside the tent, a scout suddenly pushes his way inside.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">Chieftain!</span>
<span class="dialogue-bridge">He says, breathless.</span>
<span class="dialogue-line">My squad… we did not manage to find their tracks while searching. We were just about to turn back and return to camp, but...We saw movement in the bushes!</span>
</div>
The scout, Eogan, looks between you and Kael, excitement plain on his face, as though expecting the two of you to share in it.
Kael doesn't.
He only watches the younger man calmly, arms crossed over his chest, one eyebrow lifting just slightly. A moment passes. When Eogan still says nothing more, Kael speaks.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">…And?</span>
</div>
His tone is even.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">It could have been an animal. Or was it something else, Eogan?</span>
</div>
Eogan’s expression shifts at once, as if only now realizing he has rushed to the ending of his own tale. He scratches the back of his head.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">Ah. Right. We did not report it before because… well, we did not think much of it at the time. But over the last few days, while searching, we kept hearing bushes rustling. Branches shifting. Things moving around us.</span>
</div>
He swallows, then presses on.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">At first we thought it was just animals. But it kept happening. Every day it came a little closer. Every day it got a little bolder.</span>
</div>
His voice gains strength as he continues, the memory clearly stirring him.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">At one point, some of the men started thinking we might have angered the spirits somehow, wandering around so much, trampling through places we should not. That maybe they were trying to warn us away.</span>
</div>
He pauses.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">But when it happened again today, after I made one last check for tracks before turning back… I found them.</span>
</div>
Kael says nothing. Neither do you.
Eogan goes on.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">They did not belong to the missing men. Too small. And fresh. Fresh enough that they could not have been more than moments old.</span>
</div>
Now he turns fully toward you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Eogan</span>
<span class="dialogue-line">We were being watched, Chieftain. Not by animals. Not by spirits. By men. Men who must have grown careless once they thought we were leaving.</span>
</div>
Silence settles over the tent once he finishes.
You and Kael listen without interruption, and when the scout has said all he has to say, you dismiss him with a nod. Eogan bows his head and quickly withdraws, leaving the two of you alone once more.
Kael stares at nothing in particular for a moment, deep in thought. Then, at last, he exhales through his nose and looks toward you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Well,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">I am no longer certain we will find our men.</span>
</div>
His expression hardens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">At least not alive.</span>
</div>
A brief pause follows.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">But we will certainly be finding someone.</span>
</div>
His gaze drifts toward the tent wall, as if already looking past it...Past the camp, past the tree line, into whatever waits beyond it.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Definitely worth following up on,</span>
<span class="dialogue-bridge">He says at last.</span>
<span class="dialogue-line">If someone has been shadowing our search parties for days, then that means they have either claimed this stretch of land…</span>
</div>
He lets the thought hang.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">…or they believe they can.</span>
</div>
His eyes return to yours.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Call for me when you are ready to set out, $user. I will handle other matters in the meantime.</span>
</div>
With that, Kael leaves the tent, leaving you alone with the weight of what Eogan has brought you...and with the growing certainty that this search is no longer only about the missing scouts.
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated:</span>
<span class="value">Missing Scouts</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Prepare to follow the trail.">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _attempts = Number($questFlags["q_kael_missing_scouts_01_attempts"] ?? 0)>>
<<set _dc = 14>>
<<set _hasSpark = !!($powersOwned and $powersOwned.spark)>>
<<set _stat = setup.player.getStatForCheck("wisdom")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _rawOk = (_total >= _dc)>>
<<set _kaelAssist = (!_rawOk and _attempts >= 1)>>
<<set _returnToCamp = (!_rawOk and not _kaelAssist)>>
<<set $kaelMissingScoutsTrailCheck = {
ok: (_rawOk or _kaelAssist),
rawOk: _rawOk,
assisted: _kaelAssist,
statKey: "Wisdom",
stat: _stat,
roll: _roll,
dc: _dc,
total: _total
}>>
<<if _returnToCamp>>
<<set $questFlags["q_kael_missing_scouts_01_attempts"] = _attempts + 1>>
<<else>>
<<set $questFlags["q_kael_missing_scouts_01_attempts"] = Math.max(_attempts, 1)>>
<<set $questFlags["q_kael_missing_scouts_01_trail_found"] = true>>
<<if _kaelAssist>><<set $questFlags["q_kael_missing_scouts_01_kael_assist"] = true>><</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You and Kael set out a few hours ago, making for the place Eogan described. It takes some time to find the tracks he mentioned, but in the end, you do.
True enough, even left this carelessly, they are difficult to follow—partly because of their age, and partly because whoever made them seems to move lightly even when they are not trying to.
<div class="result-list">
<<if $kaelMissingScoutsTrailCheck.rawOk>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $kaelMissingScoutsTrailCheck.total>> / <<print $kaelMissingScoutsTrailCheck.dc>></span>
</div>
<<if $kaelMissingScoutsTrailCheck.assisted>>
<div class="result-line good">
<span class="label">Progress</span>
<span class="value">Kael picks up the trail</span>
</div>
<<elseif not $kaelMissingScoutsTrailCheck.rawOk>>
<div class="result-line bad">
<span class="label">Outcome</span>
<span class="value">Return to camp and try again</span>
</div>
<</if>>
</div>
<<if $kaelMissingScoutsTrailCheck.rawOk>>
Still, neither your eyes nor your instincts fail you. Piece by piece, sign by sign, you manage to keep the trail, with Kael moving silently behind you.
<</if>>
<<if not $kaelMissingScoutsTrailCheck.rawOk and not $kaelMissingScoutsTrailCheck.assisted>>
It is difficult. Whoever left these tracks is clearly familiar with the terrain. You do your best to pick them up again whenever they fade, but by the end of it, you and Kael seem to be moving in circles.
In the end, you decide to return to camp for now and try again another day.
<</if>>
<<if $kaelMissingScoutsTrailCheck.assisted>>
Again, the tracks seem to dissolve into nothingness every time you think you have them. You search for sign after sign, but it all feels increasingly fruitless. Just as you are about to call an end to it for the day-
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Found them.</span>
</div>
Kael’s voice is calm, almost casual.
You turn to see him crouched low, gently brushing aside a layer of leaves and exposing the faint impression beneath.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Come on,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">Before the sun starts setting and we lose them again.</span>
</div>
<</if>>
<<if not _returnToCamp>>
The path you follow feels treacherous, not only because of the rough terrain, but because the great river offers a false sense of certainty. It makes you feel as though you always know where you are going, yet its bends and ridges seem almost determined to mislead you, pulling your sense of direction apart little by little.
Still, you press on.
And then-
A rustle.
A crack.
Then, faintly, the sound of drums.
Both you and Kael crouch at once as you draw closer to the source of the noise, your movements turning slow and careful. One step. Then another. The forest begins to thin.
And finally-
<</if>>
</div>''
<div class="hub-buttons">
<<if _returnToCamp>>
<<link "<span class='choice-text'>Return to camp</span>" "Hub_1">><</link>>
<<else>>
<<link "<span class='choice-text'>You see it</span>">>
<<goto "Quest_q_kael_missing_scouts_02">>
<</link>>
<</if>>
</div><<silently>><<set _hasSpark = !!($powersOwned and $powersOwned.spark)>><</silently>>
''<div class="hub-textbox">
A cluster of caves opens ahead, tucked into the landscape in such a way that they feel almost hidden from the world around them. Strange plant life grows thick around the entrances, isolated from the surrounding forest, as though the place were somehow separate from the land enclosing it. The river and dense growth around it conceal the site so well that, from a distance, it might never have been noticed at all.
Only now, standing this close, do you hear it clearly...the sounds of festivity coming from somewhere within. Voices. Movement. Drums. Something alive and communal, just out of sight deeper inside the caves.
From here, though, you still cannot make out exactly what is happening.
Kael lets out a quiet breath and motions for you to move back with him, deeper into the foliage. Once you have withdrawn a short distance, he settles against the trunk of a tree, his eyes never leaving the largest entrance.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">There seem to be quite a few of them in there,</span>
<span class="dialogue-bridge">He murmurs.</span>
<span class="dialogue-line">and they are sitting in a fairly defensible position too…</span>
</div>
Then he glances at you. His expression is a little more at ease than it usually is in camp, though his voice remains as dry as ever.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Well. I am sure you could handle it forcefully if it comes to that. <<if _hasSpark>>Maybe with that little flame you summon with a wave of your hand-flush them out, hm?<</if>></span>
</div>
Then his gaze shifts back toward the cave mouth.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">But it would be better to wait. Let things quiet down when night comes… just in case our scouts are in there.</span>
</div>
You nod, agreeing with the plan for now, and settle yourself against a tree of your own. You do not bother staring at the entrances. Your ears will warn you long before Kael’s eyes catch anything.
So you wait.
</div>''
<div class="hub-buttons">
<<if _returnToCamp>>
<<link "<span class='choice-text'>Return to camp</span>" "Hub_1">><</link>>
<<else>>
<<link "<span class='choice-text'>Wait</span>">>
<<goto "Quest_q_kael_missing_scouts_03">>
<</link>>
<</if>>
</div>''<div class="hub-textbox">
Some time passes as the two of you sit in silence, waiting for the sounds from the caves to quiet.
Kael, for his part, remains focused on the largest entrance, his eyes never straying far from it as the sun slowly begins to sink. Then, without looking away, he speaks in a low voice.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">So,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">enough time has passed that I may as well ask.</span>
</div>
A brief pause.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">How does being chieftain sit with you, $user?</span>
</div>
He asks it plainly, then waits with the same steady patience he seems to bring to everything else.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>It feels right.</span>">>
<<set $kaelScoutTalkResponse = "right">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
<<link "<span class='choice-text'>I am doing what must be done.</span>">>
<<set $kaelScoutTalkResponse = "duty">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
<<link "<span class='choice-text'>It has been harder than I expected.</span>">>
<<set $kaelScoutTalkResponse = "difficult">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
</div><<silently>>
<<set _ghostWalkCost = 35>>
<<set _hasGhostWalk = !!($powersOwned and $powersOwned.ghost_walk)>>
<<set _canGhostWalk = _hasGhostWalk and Number($belief ?? 0) >= _ghostWalkCost>>
<</silently>>
<<if false>>
''<div class="hub-textbox">
<<if $kaelScoutTalkResponse is "right">>
You explain that you are the strongets, your mind the quickest. Its only natural for you to lead /
Kael is quiet for a moment.
“Hm,” he says at last. “I thought that might be your answer.”
His eyes remain on the cave entrance, but there is no mockery in his voice.
“Since you first joined the tribe many moons ago, there was always something special about you. I saw it even when i was a child. It was also one of the reasons i vouched for you to take over when my father passed.”
<<elseif $kaelScoutTalkResponse is "duty">>
Kael gives a faint grunt, but something akin to an approving smile graces his face
“That sounds like you.”
He shifts slightly where he sits, though his gaze never leaves the caves.
“Wanting the role is one thing. Carrying it because no one else can is another. The second tends to last longer.”
Hes silent for a moment then adds
"You will take our tribe in a direction nobody else could $user. I truly belive that"
<<elseif $kaelScoutTalkResponse is "difficult">>
For a moment, Kael says nothing.
Then he nods once.
“It should be,” he says. “Anyone who finds it easy is either a fool, or not thinking hard enough.”
His tone remains even, but not cold.
“Too many lives bend around one pair of hands for it to be anything else.”
He looks away from the caves and to you, something akin to a smile gracing his face
"Still. I think you will grow into it. There is something special about you $user. Apart from the way you age, and the power you wield. I truly believe that"
<<else>>
Kael is silent for a moment, considering your answer without comment.
<</if>>
A brief silence follows.
Then Kael speaks again, his voice still low, as He shifts his weight against the tree.
“Still... being chieftain is not only about strength. Or being feared. Men can be made to kneel through fear. But that alone does not make them loyal. And it does not make them stay steady when things become difficult.”
<</if>>
''<div class="hub-textbox">
<<if $kaelScoutTalkResponse is "right">>
You explain that you are the strongest, and your mind the quickest. It is only natural for you to lead.
Kael is quiet for a moment.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Hm,</span>
<span class="dialogue-bridge">He says at last.</span>
<span class="dialogue-line">I thought that might be your answer.</span>
</div>
His eyes remain on the cave entrance, but there is no mockery in his voice.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Since you first joined the tribe many moons ago, there was always something special about you. I saw it even when I was a child. It was one of the reasons I vouched for you to take over when my father passed.</span>
</div>
<<elseif $kaelScoutTalkResponse is "duty">>
Kael gives a faint grunt, but something like an approving smile touches his face.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">That sounds like you.</span>
</div>
He shifts slightly where he sits, though his gaze never leaves the caves.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Wanting the role is one thing. Carrying it because no one else can is another. The second tends to last longer.</span>
</div>
He is silent for a moment, then adds,
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">You will take our tribe in a direction nobody else could, $user. I truly believe that.</span>
</div>
<<elseif $kaelScoutTalkResponse is "difficult">>
For a moment, Kael says nothing.
Then he nods once.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">It should be,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">Anyone who finds it easy is either a fool, or not thinking hard enough.</span>
</div>
His tone remains even, but not cold.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Too many lives bend around one pair of hands for it to be anything else.</span>
</div>
He looks away from the caves and toward you, something like a smile touching his face.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Still, I think you will grow into it. There is something special about you, $user. And I do not only mean the way you age, or the power you wield. I truly believe that.</span>
</div>
<<else>>
Kael is silent for a moment, considering your answer without comment.
<</if>>
A brief silence follows.
Then Kael speaks again, his voice still low, as he shifts his weight against the tree.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Still... being chieftain is not only about strength. Or being feared. Men can be made to kneel through fear. But that alone does not make them loyal. And it does not make them stay steady when things become difficult.</span>
</div>
He lets that hang between you for a moment.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Belief matters. In a cause. In their lives improving. In gaining food, women, and safety. Or simply in the man leading them. As long as you can make our people believe in you...in what you represent...you will be unstoppable.</span>
</div>
The drums inside the caves, for their part, still do not seem to be quieting, even now that the sun has disappeared. The voices, too, sound no less energetic than when you first arrived.
Kael notices it as well.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">An energetic lot... unnaturally so...</span>
<span class="dialogue-bridge">He murmurs.</span>
</div>
At last, his attention sharpens again, his posture straightening ever so slightly against the tree.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I do not think waiting any longer will gain us anything else. What is the plan, $user?</span>
</div>
</div>''
<div class="hub-buttons">
<<if _canGhostWalk>>
<<link "<span class='choice-text'>Sneak in by yourself</span><span class='choice-note'>[Ghost Walk: <<print _ghostWalkCost>> Belief]</span>">>
<<set $belief = Math.max(0, Number($belief ?? 0) - _ghostWalkCost)>>
<<set $kaelScoutApproach = "ghost_walk">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk">>
<</link>>
<<else>>
<span class="macro-button disabled" title="<<print _hasGhostWalk ? ('Need ' + _ghostWalkCost + ' Belief.') : 'You have not acquired Ghost Walk.'>>">
<span class="choice-text">Sneak in by yourself</span>
<span class="choice-note">[Ghost Walk: <<print _ghostWalkCost>> Belief]</span>
</span>
<</if>>
<<link "<span class='choice-text'>Sneak closer with Kael</span>">>
<<set $kaelScoutApproach = "kael">>
<<goto "Quest_q_kael_missing_scouts_05_sneak">>
<</link>>
</div><<silently>>
<<run (function () {
try {
const V = (typeof State !== "undefined" && State.variables) ? State.variables : null;
const currentTrack = String((V && V.musicState && V.musicState.track) || "");
if (currentTrack && currentTrack !== "drip" && currentTrack !== "Caves") {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack(currentTrack);
} else {
const current = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select(currentTrack)
: null;
if (current && typeof current.stop === "function") current.stop();
}
}
if (V) {
V.mainThemeActive = false;
V.introActive = false;
V.battleActive = false;
}
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("drip")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.58)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
You tell Kael that you will handle this part yourself.
He raises an eyebrow, but does not question it. Instead, he gives a short nod.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Alright,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">I will keep watch here. Be careful in there.</span>
</div>
With that, you leave him behind and make your way toward the caves alone.
You do not bother with one of the smaller side entrances. There is no need. Instead, you head straight for the large central entrance, stepping into the darkness beyond.
One step.
Then another.
As your power settles over you, the feeling is familiar—that subtle slipping of attention, the strange sense that any watching eye will find an answer for your presence before it ever reaches a real question.
Then-
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Guard 1</span>
<span class="dialogue-line">Wait. Stop!</span>
</div>
The voice rings out from ahead, sharp enough to halt you in place. A moment later, two men carrying spears emerge from the darkness and approach.
One of them looks you up and down, frowning, then gestures toward the ground in front of you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard 1</span>
<span class="dialogue-line">Are you a moron?</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">You nearly stepped on a trap. Trying to lose a leg?</span>
</div>
Only now do you notice the half-hidden cord stretched low across the stone.
The other man gives you a lazy look, as though he recognizes you, or at least sees no reason not to.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard 2</span>
<span class="dialogue-line">What took you so long, anyway?</span>
<span class="dialogue-bridge">He asks casually.</span>
<span class="dialogue-line">The festivities are already underway.</span>
</div>
The first glances at him and raises an eyebrow.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Guard 1</span>
<span class="dialogue-line">And when are they not?</span>
</div>
The two exchange a look, then shrug before turning back to you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Guard 1</span>
<span class="dialogue-line">Anyway, go on through,</span>
<span class="dialogue-bridge">The first says.</span>
<span class="dialogue-line">The two of us are stuck on watch duty for another few hours yet.</span>
</div>
Then, as an afterthought, he adds,
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Guard 1</span>
<span class="dialogue-line">But make sure ''Aífa'' saves some of the sap for us, alright?</span>
</div>
By the time he finishes, you are already walking past them.
As you round the next bend, you hear one of them scratch at his head before turning to the other.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Guard 2</span>
<span class="dialogue-line">Uh...</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">What was his name again?</span>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_02">>
<</link>>
</div><<silently>>
<<run setup.playNamedTrackFadeIn ? setup.playNamedTrackFadeIn("Caves", {
stopAll: false,
durationMs: 2600,
startRatio: 0.04,
targetVolume: (((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.72),
source: "scene"
}) : (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("Caves")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getMusicVolume01)
? setup.audio.getMusicVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.72)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
try {
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "Caves";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
In front of you, beyond the final bend of the cave, opens a chamber far larger than you expected.
And within it...
A scene of debauchery.
The festivities seem endless. A handful of men beat drums while women dance among the rest, laughing softly as they caress one another, press close, and move in slow, sensual rhythm. Some bodies lie sprawled across the stone floor, passed out where they fell. Others remain tangled together, flesh against flesh, seemingly uncaring of anything beyond their own immediate pleasures.
And yet, after watching for a few moments longer, only one among them seems truly in command of her senses.
A woman sits upon a broad stone overlooking the whole scene, her posture relaxed, her attention seemingly more focused on the strange leaf turning in her fingers than on the chaos unfolding beneath her.
Then you take a step forward.
Then another.
And at once your senses begin to come under assault.
First, your sense of smell. The air is thick, sweet, damp, almost cloying, full of the scent of crushed plants, sweat, and something stranger beneath it.
Then your hearing begins to slip. The drums seem louder now, deeper, as though the rhythm is no longer filling the chamber but pressing directly into your skull. Each beat feels heavier than the last.
Before you can steady yourself, a few of the women notice you.
They drift toward you with soft laughter, their voices light and playful, their movements unhurried. One brushes against your side. Another lets her hands wander across your chest, slow and familiar, their feminine giggles surrounding you.
The laughter, the scent, the warmth of their bodies, it all presses in at once.
Seeing this, feeling this, you decide to:
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Focus</span>">>
<<set $kaelGhostwalkResponse = "focus">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_03">>
<</link>>
<<link "<span class='choice-text'>Indulge yourself</span>">>
<<set $kaelGhostwalkResponse = "indulge">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_03">>
<</link>>
</div><<silently>><<set $kaelScoutsGhostwalkSeen = true>><</silently>>''<div class="hub-textbox">
<<if $kaelGhostwalkResponse is "focus">>
You blink once, then again, before shaking your head and forcing yourself back into focus.
The women pressing against you seem startled only for a moment as you push past them. One stumbles aside, and in the process the vessel she had been raising toward your lips slips from her grasp and falls to the ground.
It spills across the stone.
At once, it becomes clear that this must be the “sap” the guards mentioned.
Even after being shoved away, the women do not seem especially bothered. In fact, they hardly seem to notice at all. Their attention simply drifts elsewhere, settling back on one another as though nothing had happened.
You look around, and it only takes a moment to recognize the two men writhing among the others on the cave floor.
Your missing scouts.
Alive... but perhaps not well.
Even from this close, they do not recognize you. Their eyes are unfocused, their movements loose and thoughtless, their bodies swaying only to the rhythm of the drums and the hands laid upon them.
You reach down to seize one by the shoulder-
And suddenly your hand is caught.
Lifted.
A smaller hand has found yours, palm pressing against palm, fingers slowly threading between your own as a woman steps close enough for you to feel the warmth of her breath.
She smiles lightly.
It is the same woman who had been sitting upon the stone.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífa</span>
<span class="dialogue-line">Hm...</span>
<span class="dialogue-bridge">She murmurs.</span>
<span class="dialogue-line">And what do you think you are doing?</span>
</div>
Her voice is calm, faintly sensual, each word seeming to brush against your ear rather than merely reach it.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífa</span>
<span class="dialogue-line">We should not interrupt our guests until they tire themselves out, should we?</span>
</div>
Only now, seeing her up close, do you truly take in her age, and how little it seems to matter beside her beauty.
<div class="dialogue-inset">
<span class="dialogue-speaker">Aífa</span>
<span class="dialogue-line">Hm... and tell me,</span>
<span class="dialogue-bridge">She continues, studying you with open interest.</span>
<span class="dialogue-line">why are you not enjoying the festivities with the rest?</span>
</div>
Her gaze moves over you slowly, carefully.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Aífa</span>
<span class="dialogue-line">There is something strange about that, is there not?</span>
</div>
She is looking at you too closely.
Too clearly.
You feel Ghostwalk begin to strain under the weight of a sharp and searching mind.
Without answering, you pull your hand free and take a step back. Then another.
At last, you turn fully and make your way back toward the entrance.
The woman you leave behind watches you curiously, but does not follow. Your power still holds—barely—as you slip from the chamber, return to Kael, and make your way back to camp for now.
<</if>>
<<if $kaelGhostwalkResponse is "indulge">>
You let their hands roam across you.
One of the women lifts a shallow leaf-cup to your lips, and this time you do not resist. You drink, and at once you know this must be the “sap” the guards mentioned.
Its effect is immediate.
It spreads across your tongue, then through your senses, then deeper still—until the drums feel louder, the laughter warmer, the air heavier, and the touch of every hand more difficult to separate from thought itself.
For a time, you let yourself be carried by it.
<<nsfwimgnew "images/expeditions/MissingScouts/indulge.png">>
The cave, the dancers, the scent of crushed plants and sweat, the slow rhythm of flesh and music...It all swallows you up in a blur of heat and sensation.
And yet, unlike the others, your clarity returns quickly.
Almost as quickly as it left.
As your mind sharpens again, the scene comes back into focus. And there, among the bodies on the stone floor, you finally recognize them:
your missing scouts.
Alive, but lost to whatever spell, sap, or ritual has taken hold of this place.
You connect enough pieces to understand the shape of it.
Enough to know what happened to them.
Enough to know you should not remain here any longer.
But in that brief lapse, Ghostwalk has weakened.
So you turn to leave.
Before you can fully withdraw, your eyes meet those of the woman seated upon the stone. Only now, seeing her clearly, do you fully notice her beauty, and the intelligence behind it.
She watches you.
You do not stay to test whether she has seen too much.
Instead, you turn away, slip back toward the entrance, reunite with Kael, and return to camp for now.
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>">>
<<goto "Quest_q_kael_missing_scouts_return">>
<</link>>
</div><<silently>>
<<run (function () {
try {
const V = (typeof State !== "undefined" && State.variables) ? State.variables : null;
const currentTrack = String((V && V.musicState && V.musicState.track) || "");
if (currentTrack && currentTrack !== "drip" && currentTrack !== "Caves") {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack(currentTrack);
} else {
const current = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select(currentTrack)
: null;
if (current && typeof current.stop === "function") current.stop();
}
}
if (V) {
V.mainThemeActive = false;
V.introActive = false;
V.battleActive = false;
}
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("drip")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.58)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
As you tell Kael that the two of you will be sneaking in, he gives a small nod and follows after you without protest.
Together, you make your way toward one of the smaller entrances off to the side, moving carefully through the undergrowth until the cave mouth opens before you.
Inside, the place is quiet.
Quieter than it seemed from outside.
The drums and voices still echo faintly through the stone, but here—at the edges of the cave system—they feel distant, muffled, as though the rock itself is swallowing part of the sound before it can reach you.
And the place feels... alive.
The cave walls are thick with strange flora, more than should have any right to grow in a place like this. Pale vines creep along the damp stone. Wide-leafed growths cling to cracks in the rock. Clusters of soft, swollen flowers hang low in places, their shapes unfamiliar, their scent faint but heavy in the still air.
Neither you nor Kael speaks.
There is no need.
You simply press on, deeper and deeper, moving toward the distant beat of drums and the murmur of voices, careful not to let your steps carry farther than the sound itself.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_missing_scouts_sneak_02">>
<</link>>
</div><<silently>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("drip") : null>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("Caves") : null>>
<<set _missingQuestId = "q_kael_missing_scouts_01">>
<<set _missingQuestIndex = -1>>
<<set _caveQuestX = Number($campX ?? 0)>>
<<set _caveQuestY = Number($campY ?? 0)>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _missingQuestId>>
<<set _missingQuestIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _missingQuestIndex gte 0>>
<<set _caveQuestX = Number($quests[_missingQuestIndex].targetX ?? _caveQuestX)>>
<<set _caveQuestY = Number($quests[_missingQuestIndex].targetY ?? _caveQuestY)>>
<<set $quests[_missingQuestIndex].desc = "You found Kael's missing scouts alive inside a hidden cave settlement, but whatever the people there are using has left them lost in a haze of pleasure and confusion.">>
<<set $quests[_missingQuestIndex].objective = "The scouts have been found. Decide how your tribe will deal with the hidden cave people.">>
<<set $quests[_missingQuestIndex].status = "complete">>
<<set $quests[_missingQuestIndex].markerRevealed = false>>
<<set $quests[_missingQuestIndex].expeditionPassage = "">>
<</if>>
<<set $questFlags["q_kael_missing_scouts_returned"] = true>>
<<addQuestMarkerless
"q_kael_cave_tribe_01"
"The Cave Tribe"
"You found the missing scouts alive inside a hidden cave settlement. The tribe living there seems to wield some intoxicating mixture or influence strong enough to numb reason and self-control."
"You have located the cave tribe. Decide how your people will deal with them."
"Quest_q_kael_cave_tribe_01"
>>
<<set _caveQuestIndex = -1>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is "q_kael_cave_tribe_01">>
<<set _caveQuestIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _caveQuestIndex gte 0>>
<<set $quests[_caveQuestIndex].targetX = _caveQuestX>>
<<set $quests[_caveQuestIndex].targetY = _caveQuestY>>
<<set $quests[_caveQuestIndex].markerRevealed = true>>
<<set $quests[_caveQuestIndex].expeditionPassage = "Quest_q_kael_cave_tribe_01">>
<</if>>
<<set $trackedQuestId = "q_kael_cave_tribe_01">>
<</silently>>
''<div class="hub-textbox">
As you make your way back to camp, Kael lets out a slow sigh and cracks his neck.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Well,</span>
<span class="dialogue-bridge">He says.</span>
<span class="dialogue-line">we have our answers at last. Now all that remains is deciding how to solve the problem.</span>
</div>
He turns to look at you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Whatever sorcery they are using seems equally dangerous and useful. Either way, it is probably something best kept in our hands... or in no one’s hands at all.</span>
</div>
Then he gives a small shrug.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">That is my view on it, at any rate. As always, the final decision lies with you, Chieftain. I will have the men ready. Just say the word.</span>
</div>
With that, he turns and leaves to see to other matters around camp, seemingly untouched by the whole ordeal...or at least unwilling to show otherwise.
Impressive, for one who lacks your unnatural stamina.
<div class="result-list">
<div class="result-line good">
<span class="label">Quest completed</span>
<span class="value">The Missing Scouts</span>
</div>
<div class="result-line good">
<span class="label">New quest added</span>
<span class="value">The Cave Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Continue</span>">>
<<goto "Hub_1">>
<</link>>
</div><<silently>>
<<set _dc = 12>>
<<set _roll = random(1, 20)>>
<<set _stat = setup.player.getStatForCheck("endurance")>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<<set $kaelScoutSneakCheck = {
ok: _success,
statKey: "Endurance",
stat: _stat,
roll: _roll,
dc: _dc,
total: _total
}>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $kaelScoutSneakCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $kaelScoutSneakCheck.total>> / <<print $kaelScoutSneakCheck.dc>></span>
</div>
</div>
As the sound of the drums grows louder, your head begins to feel strangely light.
<<if $kaelScoutSneakCheck.ok>>
Still, you manage to shake it off for the time being.
You glance back at Kael. He seems steady, but you notice the movement of his jaw-subtle, deliberate. He is biting his tongue, keeping himself focused through the discomfort.
So. He feels it too.
<<else>>
Slowly, you begin to feel your baser urges swelling up from somewhere deep inside you. The rhythmic drums no longer sound distant or incidental. They feel directed. Measured. As though they are calling specifically to you, drawing you farther in.
Your steps begin to drift-
Then you feel a hand on your shoulder. Once. Twice.
You turn, your thoughts sharpening again, and find Kael standing close behind you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">You need to stay focused, $user. You were drifting off to the side.</span>
</div>
His voice is low and controlled. Only now do you notice the movement in his mouth as well, the way his jaw tightens every few moments.
He is biting his tongue.
It seems there is something deeply strange about this place.
<</if>>
You push forward a little farther, until at last the narrow passage opens into a wider chamber of the cave.
And finally, you-
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>See it</span>">>
<<goto "Quest_q_kael_missing_scouts_sneak_03">>
<</link>>
</div><<silently>>
<<run setup.playNamedTrackFadeIn ? setup.playNamedTrackFadeIn("Caves", {
stopAll: false,
durationMs: 2600,
startRatio: 0.04,
targetVolume: (((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.72),
source: "scene"
}) : (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("Caves")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getMusicVolume01)
? setup.audio.getMusicVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.72)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
try {
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "Caves";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
} catch (e) {}
})()>>
<<set _passedEndurance = !!($kaelScoutSneakCheck and $kaelScoutSneakCheck.ok)>>
<<set $kaelScoutsWisdomPassed = false>>
<<if _passedEndurance>>
<<set _wisdomDc = 8>>
<<set _wisdomRoll = random(1, 20)>>
<<set _wisdomStat = setup.player.getStatForCheck("wisdom")>>
<<set _wisdomTotal = _wisdomStat + _wisdomRoll>>
<<set _wisdomSuccess = (_wisdomTotal >= _wisdomDc)>>
<<set $kaelScoutsWisdomPassed = _wisdomSuccess>>
<<set $kaelScoutCaveInsightCheck = {
ok: _wisdomSuccess,
statKey: "Wisdom",
stat: _wisdomStat,
roll: _wisdomRoll,
dc: _wisdomDc,
total: _wisdomTotal
}>>
<<else>>
<<set $kaelScoutCaveInsightCheck = { ok: false, skipped: true, statKey: "Wisdom", dc: 8 }>>
<</if>>
<</silently>>
''<div class="hub-textbox">
In front of you, in the surprisingly large chamber beyond, lies a surprising sight.
A scene of debauchery.
The festivities seem endless. A handful of men beat drums while women dance among the rest, laughing softly as they caress one another, press close, and move in slow, sensual rhythm. Some bodies lie sprawled across the stone floor, passed out where they fell. Others remain tangled together, mingling flesh with flesh, seemingly uncaring of anything beyond their own immediate pleasures.
<<nsfwimgnew "images/expeditions/MissingScouts/dance.png">>
And yet, after watching for a few moments longer, only one among them seems truly in command of her senses.
A woman sits upon a broad stone overlooking the whole scene, her posture relaxed, her attention seemingly more focused on the strange leaf turning in her fingers than on the chaos unfolding beneath her.
<<if _passedEndurance>>
<div class="result-list">
<<if $kaelScoutCaveInsightCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $kaelScoutCaveInsightCheck.total>> / <<print $kaelScoutCaveInsightCheck.dc>></span>
</div>
</div>
<</if>>
<<if _passedEndurance and $kaelScoutCaveInsightCheck.ok>>
The sight is distracting in its own way, but another thought presses at the edge of your mind.
This cave. This flora. The people here.
It all feels unnatural.
You have never seen plants like these before, and this place is thick with them. A concoction, perhaps. Some brew, smoke, or salve made from the growth surrounding the chamber. Yes... that would explain part of it.
But only part.
What you felt earlier was too strong, too immediate, to be caused by the plants alone. There is something more to whatever these people are using.
Something worth remembering.
<</if>>
Kael, crouched beside you, points quietly toward a cluster of bodies on the ground.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">Those two men there,</span>
<span class="dialogue-bridge">He whispers.</span>
<span class="dialogue-line">With the women. Those are our missing scouts.</span>
</div>
His expression hardens slightly.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">But they are not in their right minds. This place is affecting them.</span>
</div>
He watches the chamber for a moment longer before speaking again, his voice flat and controlled.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I recommend we return to camp for now and decide on a plan of action, $user. We have time.</span>
</div>
His eyes flick once more toward the sprawled figures of your men.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">I do not think they will be going anywhere.</span>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Pull back for now</span>">>
<<goto "Quest_q_kael_missing_scouts_return">>
<</link>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* find quest */
<<set _qid = "q_valued_item_01">>
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i].id is _qid>>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>
''<div class="hub-textbox">
A few days of searching pass, yet nothing turns up.
Perhaps it should not be too surprising. The area is vast, after all, and the item you are looking for is, according to Halona’s description, relatively small.
Still, the failed search parties do not deter you too easily. Today, you find yourself looking for it again, this time in the company of the woman who lost it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“Where in the world is it? I remember I had it before I ran past that ridge...”</span>
</div>
She murmurs to herself, the clear annoyance in her voice perhaps amplified to better conceal the real worry behind it.
<<cgimg "images/expeditions/ValuedItem/forest.png" "Halona walking with you through the undergrowth">>
Still, you cannot focus too much on the intricacies of her emotional state, not when branches claw at your shoulders as you force your way through undergrowth still bent from recent passage.
Broken twigs.
Scuffed earth.
Someone ran through here.
And not too long ago.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“Ah! Maybe...”</span>
</div>
Before you have a chance to stop her, she rushes toward a cluster of bushes and starts rummaging through them.
As you slowly approach her, you notice her hand close around something firm. With a sharp tug, she pulls it free from the foliage.
The moment she sees it, relief flashes across her face, bright and immediate.
<<cgimg "images/expeditions/ValuedItem/forest1.png" "Halona pulling the lost item free from the bushes">>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“There it is!”</span>
<span class="dialogue-bridge">She blurts the words out, a smile spreading across her face.</span>
</div>
Yet as you get a closer look at the little thing, you cannot help but notice its... unfortunate shape.
Or perhaps fortunate.
Either way, it quickly gives you inspiration for a potential reward you could ask for.
</div>''
<div class="hub-buttons">
<<button "Suggest something fun">>
<<set $q_valued_item_01_choice = "suggest">>
<<goto "Quest_q_valued_item_01_Resolve">>
<</button>>
<<button "Let it go">>
<<set $q_valued_item_01_choice = "return">>
<<goto "Quest_q_valued_item_01_Resolve">>
<</button>>
</div><<silently>>
<<set _qid = "q_valued_item_01">>
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i].id is _qid>>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* mark quest complete */
<<if _q>>
<<set _q.status = "complete">>
<</if>>
/* apply affection reward (both outcomes) */
<<if $people and $people.length>>
<<for _j = 0; _j < $people.length; _j++>>
<<if $people[_j].id is "npc_outcast">>
<<set $people[_j].love = Number($people[_j].love ?? $people[_j].trust ?? 0) + 10>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _choice = $q_valued_item_01_choice ?? "return">>
<</silently>>
''<div class="hub-textbox">
<<if _choice is "suggest">>
<p>You offer a different use for her totem.</p>
<p>One that has nothing to do with ceremony.</p>
<p>Halona freezes.</p>
<p>Her eyes widen, mouth parting in real shock. For a moment, she only stares at you… then down at the totem in her hand.</p>
<p>She turns it over as if seeing it for the first time.</p>
<p>Color climbs into her cheeks.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“You… you dare suggest such a thing?”</span>
</div>
She sputters, indignation snapping sharp. Perhaps sharpened further by embarrassment, now that her attention has been drawn to the object’s shape.
Something she, apparently, had not considered before.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“This is a sacred object! Carved by my grandmother to honor fertility rites and tribal strength!”</span>
</div>
<p>She straightens, pride clicking back into place like a shield.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“You are lucky I owe you for saving both me and my brother.”</span>
<span class="dialogue-bridge">She says it coldly.</span>
<span class="dialogue-line">“Were my debt to you not so large, I would strike you for even suggesting such a… depraved use.”</span>
</div>
<p>And yet—</p>
<p>Her fingers trace the carved length almost absently.</p>
<p>The spark in her eyes does not quite match her outrage.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“Still…”</span>
<span class="dialogue-bridge">She adds it after a beat, quieter now.</span>
<span class="dialogue-line">“Perhaps we could… discuss this further.”</span>
</div>
<p>Her gaze flicks away.</p>
<p>Then back to you.</p>
<p>There is anger in her eyes, though whether true or mock is suddenly much harder to tell.</p>
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“Back at camp. Away from prying eyes.”</span>
</div>
<<else>>
<p>You decide not to speak of it further.</p>
<p>It seems... beneath you.</p>
<p>There will be other opportunities.</p>
<p>Halona, for her part, cradles the totem with reverence, almost oblivious to its suggestive shape.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“My grandmother carved this.”</span>
<span class="dialogue-bridge">She explains it softly, turning the object slowly in her hands.</span>
<span class="dialogue-line">“It is a symbol of fertility and strength in my tribe. I carry it whenever I travel unfamiliar land.”</span>
</div>
<p>Her gaze lingers on you a little longer than before.</p>
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">“I owe you a debt.”</span>
<span class="dialogue-bridge">She says it quietly.</span>
<span class="dialogue-line">“Few would search so hard for something so… personal.”</span>
</div>
<p>After she finishes examining its state, you help her to her feet, and together you begin making your way back to camp.</p>
<p>As you walk, you catch a glance at her.</p>
<p>Her posture is less rigid than before.</p>
<p>And she walks closer to you than she did on the way here.</p>
<</if>>
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Quest</span>
<span class="value">Completed</span>
</div>
<div class="result-line">
<span class="label">Outcome</span>
<span class="value"><<print _choice is "suggest" ? "Suggested something fun" : "Let it go">></span>
</div>
<div class="result-line good">
<span class="label">Affection</span>
<span class="value">+10 (Halona)</span>
</div>
<<if _choice is "suggest">>
<div class="result-line">
<span class="label">Unlocked</span>
<span class="value">Secret follow-up</span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<button "Return to camp">>
<<if _choice is "suggest">>
<<goto "Quest_q_valued_item_01_Secret">>
<<else>>
<<goto "Hub_1">>
<</if>>
<</button>>
</div>''<div class="hub-textbox">
Back in her tent, firelight flickers low, casting slow-moving shadows across the stretched hides that serve as walls.
Halona sits opposite you, the totem resting loosely in her hands. Her expression is carefully blank.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Such a depraved suggestion,</span>
<span class="dialogue-bridge">She mutters at last, eyes lifting to meet yours.</span>
<span class="dialogue-line">Only someone twisted would look at a sacred object and see… something else.</span>
</div>
Despite the words, she doesn’t let go of the totem, nor does she storm out.
Her fingers trace the carved patterns instead—slow, deliberate, lingering far longer than needed.
<<nsfwimgnew "images/expeditions/ValuedItem/ValuedItem1.png">>
She shifts.
The simple hide garment slips aside, baring her thighs in the firelight. You don’t speak. You don’t need to.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You’re enjoying this, aren’t you?</span>
<span class="dialogue-bridge">She says, accusing—but there’s no bite behind it.</span>
<span class="dialogue-line">Watching me defile something sacred for your satisfaction.</span>
</div>
Her gaze sharpens.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Aren’t you, $user?</span>
</div>
Her hand drifts lower.
The carved tip brushes against her, and a soft gasp escapes before she can stop it.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">This is ridiculous,</span>
<span class="dialogue-bridge">She murmurs.</span>
</div>
But her body betrays her as she parts her legs further.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">I’m only doing this because I owe you a debt,</span>
<span class="dialogue-bridge">She adds quickly.</span>
<span class="dialogue-line">Nothing more.</span>
</div>
<<nsfwimgnew "images/expeditions/ValuedItem/ValuedItem2.png">>
The totem slides deeper.
Her breath stutters. Her eyes close—just for a moment—before opening again to fix on you.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Don’t look so pleased,</span>
<span class="dialogue-bridge">She pants, beginning to move it with an unsteady rhythm.</span>
<span class="dialogue-line">This means nothing. It’s just… curiosity.</span>
</div>
Her hips start to follow her hand.
Resistance fades. Words soften. Insults lose their edge.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Perverted… watching me like this…</span>
<span class="dialogue-bridge">She manages, voice thick.</span>
<span class="dialogue-line">You’re lucky I—oh…</span>
</div>
<<nsfwimgnew "images/expeditions/ValuedItem/ValuedItem3.png">>
Her movements grow faster, more urgent.
Firelight gleams along the carved wood as she works it deeper, one hand clawing into the furs beneath her.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">You probably think this means something,</span>
<span class="dialogue-bridge">She gasps, body arching.</span>
<span class="dialogue-line">That I want you… that I’m enjoying this…</span>
</div>
The rest dissolves into a sharp cry.
Her body tenses, then shudders—muscles clenching hard around the totem as the release takes her. For a moment, she is utterly silent, trembling.
When her eyes finally open, they’re unfocused—hazy with the aftermath.
She withdraws the totem slowly, fingers unsteady.
<div class="dialogue-inset">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">There,</span>
<span class="dialogue-bridge">She says, breath still uneven.</span>
<span class="dialogue-line">Your debt is paid.</span>
</div>
Her gaze hardens again, armor snapping back into place.
<div class="dialogue-inset dialogue-inset--brief">
<span class="dialogue-speaker">Halona</span>
<span class="dialogue-line">Now get out.</span>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "Hub_1">>
<</button>>
</div><<nobr>>
<<silently>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if !$untrackedQuestIds>><<set $untrackedQuestIds = []>><</if>>
/* Collect active quest IDs */
<<set _activeQuestIds = []>>
<<if $quests and $quests.length>>
<<for _a = 0; _a < $quests.length; _a++>>
<<set _q = $quests[_a]>>
<<if _q and _q.status is "active">>
<<set _qid = String(_q.id)>>
<<if _qid and _activeQuestIds.indexOf(_qid) is -1>>
<<set _activeQuestIds.push(_qid)>>
<</if>>
<</if>>
<</for>>
<</if>>
/* Prune tracked to active */
<<set _newTracked = []>>
<<for _b = 0; _b < $trackedQuestIds.length; _b++>>
<<set _tid = String($trackedQuestIds[_b])>>
<<if _activeQuestIds.indexOf(_tid) >= 0 and _newTracked.indexOf(_tid) is -1>>
<<set _newTracked.push(_tid)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _newTracked>>
/* Prune untracked to active */
<<set _newUntracked = []>>
<<for _c = 0; _c < $untrackedQuestIds.length; _c++>>
<<set _uid = String($untrackedQuestIds[_c])>>
<<if _activeQuestIds.indexOf(_uid) >= 0 and _newUntracked.indexOf(_uid) is -1>>
<<set _newUntracked.push(_uid)>>
<</if>>
<</for>>
<<set $untrackedQuestIds = _newUntracked>>
/* Ensure tracked doesn't contain explicit untracked */
<<set _cleanTracked = []>>
<<for _d = 0; _d < $trackedQuestIds.length; _d++>>
<<set _tid2 = String($trackedQuestIds[_d])>>
<<if $untrackedQuestIds.indexOf(_tid2) is -1 and _cleanTracked.indexOf(_tid2) is -1>>
<<set _cleanTracked.push(_tid2)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _cleanTracked>>
/* Default: track all active quests unless explicitly untracked */
<<for _e = 0; _e < _activeQuestIds.length; _e++>>
<<set _aid = _activeQuestIds[_e]>>
<<if $untrackedQuestIds.indexOf(_aid) is -1 and $trackedQuestIds.indexOf(_aid) is -1>>
<<set $trackedQuestIds.push(_aid)>>
<</if>>
<</for>>
<</silently>>
<div class="quests-screen">
<section class="quests-board">
<header class="quests-board-header">
<div class="quests-heading">
<div class="quests-kicker">Quest Board</div>
<h2 class="quests-title">Tasks</h2>
<p class="quests-subtitle">Keep only the objectives you care about tracked on the map. The marker state below tells you what the wilderness will currently reveal.</p>
</div>
<div class="quests-summary">
<span class="quests-summary-pill"><<print _activeQuestIds.length>> active</span>
<span id="quests-tracked-count" class="quests-summary-pill quests-summary-pill-dim"><<print $trackedQuestIds.length>> tracked</span>
<div class="char-return quest-return">
<<return>>
</div>
</div>
</header>
<<if !_activeQuestIds.length>>
<div class="quests-empty">
<div class="quests-empty-kicker">Nothing pressing</div>
<div class="quests-empty-title">No active tasks yet.</div>
<p class="quests-empty-copy">Explore, survive, and let events unfold. New tasks will be recorded here when the world gives you something worth following.</p>
</div>
<<else>>
<<set _displayQuests = (setup.mishan and setup.mishan.prioritizeMainStoryQuests) ? setup.mishan.prioritizeMainStoryQuests($quests) : $quests>>
<div class="quests-list">
<<for _questDisplayIndex = 0; _questDisplayIndex < _displayQuests.length; _questDisplayIndex++>>
<<set _q = _displayQuests[_questDisplayIndex]>>
<<if _q and _q.status is "active">>
<<set _qid = String(_q.id)>>
<<set _qname = _q.name>>
<<set _tracked = ($trackedQuestIds.indexOf(_qid) >= 0)>>
<<set _timerView = setup.quests and setup.quests.getTimerView ? setup.quests.getTimerView(_q) : null>>
<<set _isMishanMain = !!(setup.mishan and setup.mishan.isCampaignVisible and setup.mishan.isCampaignVisible() and setup.mishan.isMainStoryQuest and setup.mishan.isMainStoryQuest(_q))>>
<article @class="'quest-card' + (_isMishanMain ? ' is-mishan-main' : '')">
<div class="quest-top">
<div class="quest-title-block">
<div class="quest-kicker">Active task</div>
<div class="quest-name"><<print _qname>></div>
</div>
<div class="quest-state">
<<if _isMishanMain>><span class="quest-tag quest-tag-main-story">Main Story</span><</if>>
<span class="quest-track-state-live" @id="'quest-track-state-' + _qid"><<QuestTrackedStateTag _qid>></span>
<<if _timerView and _timerView.visible>>
<span class="quest-tag quest-tag-timer <<print _timerView.className>>"><<print _timerView.shortText>></span>
<</if>>
<<if _q.markerRevealed>>
<span class="quest-tag quest-tag-marker">Marker revealed</span>
<<else>>
<span class="quest-tag quest-tag-dim">Marker hidden</span>
<</if>>
</div>
</div>
<<if _q.desc>>
<div class="quest-desc"><<print _q.desc>></div>
<</if>>
<<if _q.objective>>
<div class="quest-obj">
<div class="quest-obj-label">Next step</div>
<div class="quest-obj-inner"><<print _q.objective>></div>
</div>
<</if>>
<<if _timerView and _timerView.visible>>
<div class="quest-timer <<print _timerView.className>>">
<div class="quest-timer-label">Time remaining</div>
<div class="quest-timer-inner"><<print _timerView.detail>></div>
</div>
<</if>>
<div class="quest-actions-row">
<div class="quest-actions"><<QuestTrackToggle _qid>></div>
</div>
</article>
<</if>>
<</for>>
</div>
<</if>>
<div class="quests-toast muted">
<<if $questsToastText>><<print $questsToastText>><</if>>
</div>
<<silently>><<set $questsToastText = "">><</silently>>
</section>
<aside class="quests-side-void quests-mandates-mount">
<<aspectMandatesPanel>>
</aside>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
<<if !$raidV1 or !$raidV1.active>><<if $raidCtx and $raidCtx._active>><<goto "Raid_V1_Defense_Setup">><<else>><<goto "Raid_V1_Setup">><</if>><</if>>
<<run setup.raidV1.repairInitialCommanderFocus($raidV1)>>
<<run setup.raidV1.ensureRound($raidV1)>>
<<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><</if>>
<<set _isDefense = setup.raidV1.isDefense($raidV1)>>
<<set _powersLockReason = setup.raidV1.getPowersPanelLockReason($raidV1)>>
<<if _powersLockReason and (($raidV1.actionPanel ?? "commands") is "powers")>><<set $raidV1.actionPanel = "commands">><</if>>
<<set _selected = $raidV1.selectedLane ?? "center">>
<<set _slot = $raidV1.lanes[_selected]>>
<<set _leaderName = setup.raidV1.getLeaderName($raidV1)>>
<<set _enemyLeaderName = setup.raidV1.getEnemyLeaderName($raidV1)>>
<<set _battleTitle = setup.raidV1.getBattleTitle($raidV1)>>
<<set _battleSubtitle = setup.raidV1.getBattleSubtitle($raidV1)>>
<<set _terrainLabel = $raidV1.terrain?.label ?? "Open Ground">>
<<set _attackerFronts = $raidV1.terrain?.frontCaps?.attacker ?? 3>>
<<set _defenderFronts = $raidV1.terrain?.frontCaps?.defender ?? 3>>
<<set _friendlyRoleSig = setup.raidV1.getRoleSigForSide($raidV1, "friendly")>>
<<set _enemyRoleSig = setup.raidV1.getRoleSigForSide($raidV1, "enemy")>>
<<set _friendlyRoleLabel = setup.raidV1.getRoleLabelForSide($raidV1, "friendly")>>
<<set _enemyRoleLabel = setup.raidV1.getRoleLabelForSide($raidV1, "enemy")>>
<<set _selectedLock = setup.raidV1.getLaneLockState($raidV1, _selected)>>
<<set _selectedLeaderBonus = setup.raidV1.getLeaderBonus($raidV1, _selected, "friendly")>>
<<set _selectedMomentum = setup.raidV1.getLaneMomentumView($raidV1, _selected)>>
<<set _stepPrompt = setup.raidV1.getBattleStepPrompt($raidV1)>>
<<set _pushLabel = setup.raidV1.getCommandActionLabel("Push", "push")>>
<<set _holdLabel = setup.raidV1.getCommandActionLabel("Hold", "hold")>>
<<set _rallyLabel = setup.raidV1.getCommandActionLabel("Rally", "rally")>>
<<set _repositionLabel = setup.raidV1.getCommandActionLabel("Reposition Leader", "reposition_leader")>>
<<set _shiftLeftLabel = setup.raidV1.getCommandActionLabel("Shift Left", "shift_left")>>
<<set _shiftRightLabel = setup.raidV1.getCommandActionLabel("Shift Right", "shift_right")>>
<<set _reserveLabel = setup.raidV1.getCommandActionLabel("Deploy Reserve", "shift")>>
<<run setup.raidV1.scheduleBattleStatTooltips($raidV1)>>
<<run setup.raidV1.scheduleBattleLogScroll()>>
<</silently>>
<div class="raidv1-wrap raidv1-battlelayout">
<div class="raidv1-panel raidv1-battleinfo">
<div class="raidv1-title"><<print _battleTitle>></div>
<div class="raidv1-subtitle"><<print _battleSubtitle>></div>
</div>
<div class="raidv1-summarybar raidv1-battlestats">
<div class="raidv1-optioncard"><span class="raidv1-label">Leader</span><span class="raidv1-value"><<print _leaderName>></span></div>
<div class="raidv1-optioncard raidv1-optioncard--enemy-leader"><span class="raidv1-label">Enemy Leader</span><span class="raidv1-value"><<print _enemyLeaderName>></span></div>
<div class="raidv1-optioncard raidv1-stathelp" data-tip="Command Points (CP) pay for orders this round. Most commands cost 1 CP; unspent CP is discarded when the round ends."><span class="raidv1-label">Command Points</span><span class="raidv1-value"><<print $raidV1.commandPoints>> CP</span></div>
<div class="raidv1-optioncard raidv1-stathelp" data-tip="Resolve measures your army's will to continue. If it reaches 0, your side breaks."><span class="raidv1-label">Your Resolve</span><span class="raidv1-value"><<print $raidV1.playerResolve>></span></div>
<div class="raidv1-optioncard raidv1-stathelp" data-tip="Enemy Resolve measures the opposing army's will to continue. Reduce it to 0 to break their side."><span class="raidv1-label">Enemy Resolve</span><span class="raidv1-value"><<print $raidV1.enemyResolve>></span></div>
<div class="raidv1-optioncard raidv1-stathelp" data-tip="Warbands outside the active fronts. Friendly reserves can be deployed into an open empty lane for 1 CP."><span class="raidv1-label">Reserves</span><span class="raidv1-value">You <<print $raidV1.reserves.friendly.length>> / Enemy <<print $raidV1.reserves.enemy.length>></span></div>
</div>
<div class="raidv1-battlefield raidv1-frontline">
<<for _i = 0; _i < setup.raidV1.lanes.length; _i++>>
<<set _lane = setup.raidV1.lanes[_i]>>
<<set _laneSlot = $raidV1.lanes[_lane]>>
<<set _f = _laneSlot.friendly>>
<<set _e = _laneSlot.enemy>>
<<set _fView = setup.raidV1.getBandView($raidV1, _lane, "friendly")>>
<<set _eView = setup.raidV1.getBandView($raidV1, _lane, "enemy")>>
<<set _laneLock = setup.raidV1.getLaneLockState($raidV1, _lane)>>
<<set _momentumView = setup.raidV1.getLaneMomentumView($raidV1, _lane)>>
<<set _laneClass = "raidv1-lane raidv1-frontlane" + (_selected === _lane ? " is-selected" : "") + (!_laneLock.friendlyOpen ? " is-friendly-locked" : "") + (!_laneLock.enemyOpen ? " is-enemy-locked" : "")>>
<div @class="_laneClass">
<div class="raidv1-lanehead">
<div class="raidv1-laneheadcopy">
<strong><<print setup.raidV1.getLaneLabel(_lane)>></strong>
<div class="raidv1-lockrow">
<span class="raidv1-tipwrap raidv1-tipwrap--inline" data-tip="Your side is the <<print _friendlyRoleLabel.toLowerCase()>> here. A crossed marker means this terrain closes that front."><span class="raidv1-locksig is-friendly <<if !_laneLock.friendlyOpen>>is-locked<</if>>"><<print _friendlyRoleSig>></span></span>
<span class="raidv1-tipwrap raidv1-tipwrap--inline" data-tip="The enemy side is the <<print _enemyRoleLabel.toLowerCase()>> here. A crossed marker means this terrain closes that front."><span class="raidv1-locksig is-enemy <<if !_laneLock.enemyOpen>>is-locked<</if>>"><<print _enemyRoleSig>></span></span>
</div>
</div>
<div class="raidv1-lanebadges"><<if _selected is _lane>><span class="raidv1-chip is-active">Selected Lane</span><</if>><<if $raidV1.leaderLane is _lane>><span class="raidv1-chip raidv1-chip--leader">Leader Focus</span><</if>><<if _selected isnot _lane and $raidV1.leaderLane isnot _lane>><span class="raidv1-chip is-muted">Lane</span><</if>></div>
</div>
<div class="raidv1-card raidv1-card--friendly">
<div class="raidv1-bandname">Friendly</div>
<<if _f>>
<div class="raidv1-bandname"><<print _f.label>></div>
<div class="raidv1-focusrow"><span class="raidv1-focuslabel">Warband Focus</span><span class="raidv1-focusline"><span class="raidv1-focusarrow"></span><span class="raidv1-focusvalue"><<print _fView.focusText>></span></span></div>
<<if _momentumView.friendlyAmount > 0>><span class="raidv1-tipwrap raidv1-tipwrap--inline" @data-tip="_momentumView.title + '. ' + _momentumView.effect"><span class="raidv1-momentumtag is-friendly">Momentum <<print _momentumView.friendlyAmount>></span></span><</if>>
<div class="raidv1-bandmeta">
<div><span class="raidv1-label">HP</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _fView.hpTooltipAttr>>"><span class="raidv1-value"><<print _f.hp>> / <<print _f.maxHp>></span></span></div>
<div><span class="raidv1-label">Morale</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _fView.moraleTooltipAttr>>"><span class="raidv1-value"><<print _fView.effectiveMorale>> / <<print _f.maxMorale>></span></span></div>
<div><span class="raidv1-label">ATK</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _fView.atkTooltipAttr>>"><span class="raidv1-value"><<print _fView.effectiveAtk>></span></span></div>
<div><span class="raidv1-label">DEF</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _fView.defTooltipAttr>>"><span class="raidv1-value"><<print _fView.effectiveDef>></span></span></div>
</div>
<<if _fView.modifierText>><div class="raidv1-bandeffect"><<print _fView.modifierText>></div><</if>>
<<if _fView.leaderText>><div class="raidv1-bandeffect raidv1-bandeffect--leader"><<print _fView.leaderText>></div><</if>>
<<else>>
<<if !_laneLock.friendlyOpen>>
<div class="raidv1-empty raidv1-empty--locked"><span class="raidv1-locked-label">Terrain Blocked</span><span class="raidv1-locked-copy">This <<print _friendlyRoleLabel.toLowerCase()>> front is closed by the terrain.</span></div>
<<else>>
<div class="raidv1-empty">No friendly warband in this lane.</div>
<</if>>
<</if>>
</div>
<div class="raidv1-card raidv1-card--enemy">
<div class="raidv1-bandname">Enemy</div>
<<if _e>>
<div class="raidv1-bandname"><<print _e.label>></div>
<div class="raidv1-focusrow"><span class="raidv1-focuslabel">Warband Focus</span><span class="raidv1-focusline"><span class="raidv1-focusarrow is-reverse"></span><span class="raidv1-focusvalue"><<print _eView.focusText>></span></span></div>
<<if _momentumView.enemyAmount > 0>><span class="raidv1-tipwrap raidv1-tipwrap--inline" @data-tip="_momentumView.title + '. ' + _momentumView.effect"><span class="raidv1-momentumtag is-enemy">Momentum <<print _momentumView.enemyAmount>></span></span><</if>>
<div class="raidv1-bandmeta">
<div><span class="raidv1-label">HP</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _eView.hpTooltipAttr>>"><span class="raidv1-value"><<print _e.hp>> / <<print _e.maxHp>></span></span></div>
<div><span class="raidv1-label">Morale</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _eView.moraleTooltipAttr>>"><span class="raidv1-value"><<print _eView.effectiveMorale>> / <<print _e.maxMorale>></span></span></div>
<div><span class="raidv1-label">ATK</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _eView.atkTooltipAttr>>"><span class="raidv1-value"><<print _eView.effectiveAtk>></span></span></div>
<div><span class="raidv1-label">DEF</span><span class="raidv1-tipwrap raidv1-tipwrap--stat" data-tip="<<print _eView.defTooltipAttr>>"><span class="raidv1-value"><<print _eView.effectiveDef>></span></span></div>
</div>
<<if _eView.modifierText>><div class="raidv1-bandeffect"><<print _eView.modifierText>></div><</if>>
<<if _eView.leaderText>><div class="raidv1-bandeffect raidv1-bandeffect--leader"><<print _eView.leaderText>></div><</if>>
<div class="raidv1-planline">
<<set _laneKey = _lane>>
<<set _planIntel = ($raidV1.enemyPlanIntel && $raidV1.enemyPlanIntel[_laneKey]) ? $raidV1.enemyPlanIntel[_laneKey] : null>>
<<if _planIntel and Number(_planIntel.round ?? 0) is Number($raidV1.round ?? 0)>>
<<if _planIntel.ok>>
<span class="raidv1-tipwrap"><span class="raidv1-chip raidv1-planbadge is-active">Plan: <<print _planIntel.label>></span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_planIntel.tooltip)>></span></span>
<<else>>
<span class="raidv1-tipwrap"><span class="raidv1-chip raidv1-planbadge is-muted">Plan: ???</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_planIntel.tooltip)>></span></span>
<</if>>
<<elseif setup.raidV1.canRevealEnemyPlan($raidV1, _laneKey)>>
<<capture _laneKey>>
<<set _probeTip = setup.raidV1.getEnemyPlanProbeTooltip($raidV1, _laneKey)>><span class="raidv1-tipwrap"><<button "Plan: ???">><<run setup.raidV1.revealEnemyPlan($raidV1, _laneKey)>><<goto "Raid_V1_Battle">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_probeTip)>></span></span>
<</capture>>
<<else>>
<<set _probeTip = setup.raidV1.getEnemyPlanProbeTooltip($raidV1, _laneKey)>><span class="raidv1-tipwrap"><span class="raidv1-chip raidv1-planbadge is-muted">Plan: ???</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_probeTip)>></span></span>
<</if>>
</div>
<<else>>
<<if !_laneLock.enemyOpen>>
<div class="raidv1-empty raidv1-empty--locked"><span class="raidv1-locked-label">Terrain Blocked</span><span class="raidv1-locked-copy">This <<print _enemyRoleLabel.toLowerCase()>> front is closed by the terrain.</span></div>
<<else>>
<div class="raidv1-empty">No enemy warband holding this lane.</div>
<</if>>
<</if>>
</div>
<div class="raidv1-actionrow raidv1-laneselect">
<<if _selected is _lane>>
<span class="raidv1-chip is-active">Selected lane</span>
<<else>>
<<set _laneKey = _lane>>
<<capture _laneKey>>
<span class="raidv1-tipwrap raidv1-tipwrap--inline" data-tip="Select this lane for commands and battle powers."><<button "Select lane">><<run setup.raidV1.selectLane($raidV1, _laneKey)>><<goto "Raid_V1_Battle">><</button>></span>
<</capture>>
<</if>>
</div>
</div>
<</for>>
</div>
<div class="raidv1-midgrid raidv1-sidebar">
<div class="raidv1-panel raidv1-sidepanel raidv1-sidepanel--selected">
<h3>Current Decision</h3>
<div class="raidv1-statgrid">
<div class="raidv1-optioncard"><span class="raidv1-label">Selected Lane</span><span class="raidv1-value"><<print setup.raidV1.getLaneLabel(_selected)>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Leader Focus</span><span class="raidv1-value"><<print setup.raidV1.getLaneLabel($raidV1.leaderLane)>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Focus Bonus</span><span class="raidv1-value"><<if $raidV1.leaderLane is _selected>><<print setup.raidV1.describeLeaderBonus(_selectedLeaderBonus)>><<else>>Focused elsewhere<</if>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Momentum</span><span class="raidv1-value"><<if _selectedMomentum.amount > 0>><<print _selectedMomentum.owner>> <<print _selectedMomentum.amount>><<else>>None<</if>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Belief</span><span class="raidv1-value"><<print $belief ?? 0>></span></div>
</div>
<p class="raidv1-note raidv1-note--momentum"><<print _selectedMomentum.title>>. <<print _selectedMomentum.effect>></p>
<p class="raidv1-note raidv1-note--glossary">Orders target the Selected Lane. Leader Focus supplies the shown bonus; Warband Focus remains on each lane card.</p>
<<if !_selectedLock.friendlyOpen>>
<p class="raidv1-note">This <<print _friendlyRoleLabel.toLowerCase()>> front is closed by terrain. Orders here stay disabled until you select an open lane.</p>
<<elseif !_selectedLock.enemyOpen>>
<p class="raidv1-note">The <<print _enemyRoleLabel.toLowerCase()>> cannot field a front here, so extra enemy warbands remain in reserve.</p>
<</if>>
<<if $raidV1.notice>>
<p class="raidv1-note"><<print $raidV1.notice>></p>
<</if>>
</div>
<div class="raidv1-panel raidv1-sidepanel raidv1-sidepanel--log">
<h3>Battle Record</h3>
<ul class="raidv1-loglist">
<<for _idx = 0; _idx < $raidV1.log.length; _idx++>>
<li><<print $raidV1.log[_idx]>></li>
<</for>>
</ul>
</div>
</div>
<div class="raidv1-panel raidv1-commandpanel">
<div class="raidv1-commandhead">
<div class="raidv1-stepcallout"><span>Current Step</span><strong><<print _stepPrompt>></strong></div>
<div class="raidv1-paneltabs">
<<if (($raidV1.actionPanel ?? "commands") is "commands")>>
<span class="raidv1-chip is-active">Commands</span>
<<else>>
<<button "Commands">><<run setup.raidV1.selectActionPanel($raidV1, "commands")>><<goto "Raid_V1_Battle">><</button>>
<</if>>
<<if _powersLockReason>>
<span class="raidv1-chip is-muted">Powers</span>
<<elseif (($raidV1.actionPanel ?? "commands") is "powers")>>
<span class="raidv1-chip is-active">Powers</span>
<<else>>
<<button "Powers">><<run setup.raidV1.selectActionPanel($raidV1, "powers")>><<goto "Raid_V1_Battle">><</button>>
<</if>>
</div>
</div>
<div class="raidv1-commandmeta">
<<if (($raidV1.actionPanel ?? "commands") is "powers")>>
<p class="raidv1-subtitle">Belief-fuelled battle powers answer from your divinity. Some focus on the <<print setup.raidV1.getLaneLabel(_selected).toLowerCase()>> lane; others read the whole field. Leader-locked powers can only be cast where the leader is focused.</p>
<div class="raidv1-powermeta">
<div class="raidv1-optioncard"><span class="raidv1-label">Belief</span><span class="raidv1-value"><<print $belief ?? 0>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Leader Lane</span><span class="raidv1-value"><<print setup.raidV1.getLaneLabel($raidV1.leaderLane)>></span></div>
</div>
<<else>>
<p class="raidv1-subtitle">Commands apply to the <<print setup.raidV1.getLaneLabel(_selected).toLowerCase()>> lane. A and D markers show open attacker and defender fronts; crossed markers mean terrain lock.</p>
<</if>>
</div>
<div class="raidv1-panelcontent">
<<capture _selected>>
<<if (($raidV1.actionPanel ?? "commands") is "powers")>>
<<set _raidPowers = setup.raidV1.listRaidPowers()>>
<<if _raidPowers.length>>
<div class="raidv1-powergrid">
<<for _p = 0; _p < _raidPowers.length; _p++>>
<<set _power = _raidPowers[_p]>>
<<capture _power>>
<<set _tip = setup.raidV1.getPowerTooltip($raidV1, _power.id, _selected)>>
<<set _powerActionLabel = setup.raidV1.getPowerActionLabel(_power)>>
<<if !setup.raidV1.getPowerUnavailableReason($raidV1, _power.id, _selected)>>
<span class="raidv1-tipwrap" @data-tip="_tip"><<button _powerActionLabel>><<run setup.raidV1.usePowerWithShowcase($raidV1, _power.id, _selected)>><</button>></span>
<<else>>
<span class="raidv1-tipwrap" @data-tip="_tip"><span class="macro-button disabled"><<print _powerActionLabel>></span></span>
<</if>>
<</capture>>
<</for>>
</div>
<<else>>
<p class="raidv1-powerempty">No battle powers are available yet. Acquire combat-ready powers to unleash them here during the fight.</p>
<</if>>
<<else>>
<div class="raidv1-commandgrid">
<<if setup.raidV1.canUseCommand($raidV1, "push", _selected)>><span class="raidv1-tipwrap" data-tip="Aggressive order. Costs 1 CP. Effect: +2 ATK and -1 DEF for this round. Counter: Push beats Rally."><<button _pushLabel>><<run setup.raidV1.command($raidV1, "push", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Aggressive order. Costs 1 CP. Effect: +2 ATK and -1 DEF for this round. Counter: Push beats Rally."><span class="macro-button disabled"><<print _pushLabel>></span></span><</if>>
<<if setup.raidV1.canUseCommand($raidV1, "hold", _selected)>><span class="raidv1-tipwrap" data-tip="Defensive order. Costs 1 CP. Effect: +2 DEF and +1 morale for this round. Counter: Hold beats Push."><<button _holdLabel>><<run setup.raidV1.command($raidV1, "hold", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Defensive order. Costs 1 CP. Effect: +2 DEF and +1 morale for this round. Counter: Hold beats Push."><span class="macro-button disabled"><<print _holdLabel>></span></span><</if>>
<<if setup.raidV1.canUseCommand($raidV1, "rally", _selected)>><span class="raidv1-tipwrap" data-tip="Recovery order. Costs 1 CP. Effect: +1 DEF and restores morale based on leadership. Counter: Rally beats Hold."><<button _rallyLabel>><<run setup.raidV1.command($raidV1, "rally", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Recovery order. Costs 1 CP. Effect: +1 DEF and restores morale based on leadership. Counter: Rally beats Hold."><span class="macro-button disabled"><<print _rallyLabel>></span></span><</if>>
<<if setup.raidV1.canUseCommand($raidV1, "reposition_leader", _selected)>><span class="raidv1-tipwrap" data-tip="Move leader focus to the selected lane. Costs 1 CP. Usable once per round."><<button _repositionLabel>><<run setup.raidV1.command($raidV1, "reposition_leader", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Move leader focus to the selected lane. Costs 1 CP. Usable once per round."><span class="macro-button disabled"><<print _repositionLabel>></span></span><</if>>
<<if setup.raidV1.canUseCommand($raidV1, "shift_left", _selected)>><span class="raidv1-tipwrap" data-tip="Move this warband one lane left. Costs 1 CP. Disabled if the left lane is closed or already holds a friendly warband."><<button _shiftLeftLabel>><<run setup.raidV1.command($raidV1, "shift_left", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Move this warband one lane left. Costs 1 CP. Disabled if the left lane is closed or already holds a friendly warband."><span class="macro-button disabled"><<print _shiftLeftLabel>></span></span><</if>>
<<if setup.raidV1.canUseCommand($raidV1, "shift_right", _selected)>><span class="raidv1-tipwrap" data-tip="Move this warband one lane right. Costs 1 CP. Disabled if the right lane is closed or already holds a friendly warband."><<button _shiftRightLabel>><<run setup.raidV1.command($raidV1, "shift_right", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Move this warband one lane right. Costs 1 CP. Disabled if the right lane is closed or already holds a friendly warband."><span class="macro-button disabled"><<print _shiftRightLabel>></span></span><</if>>
<<if !_slot.friendly>><<if setup.raidV1.canUseCommand($raidV1, "shift", _selected)>><span class="raidv1-tipwrap" data-tip="Deploy the next friendly reserve into this empty lane. Costs 1 CP."><<button _reserveLabel>><<run setup.raidV1.command($raidV1, "shift", _selected)>><<if $raidV1.outcome>><<goto setup.raidV1.getResultPassage($raidV1)>><<else>><<goto "Raid_V1_Battle">><</if>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Deploy the next friendly reserve into this empty lane. Costs 1 CP."><span class="macro-button disabled"><<print _reserveLabel>></span></span><</if>><</if>>
</div>
<</if>>
<div class="raidv1-commandfooter">
<span class="raidv1-actionslot raidv1-actionslot--primary"><<if setup.raidV1.canUseCommand($raidV1, "end_round", _selected)>><span class="raidv1-tipwrap" data-tip="Resolve enemy AI and every lane. You may end the round early, but any unspent CP is discarded."><<button "End Round">><<run setup.raidV1.handleBattleAction($raidV1, "end_round", _selected)>><</button>></span><<else>><span class="raidv1-tipwrap" data-tip="Resolve enemy AI and every lane."><span class="macro-button disabled">End Round</span></span><</if>></span>
<<if setup.raidV1.canUseCommand($raidV1, "withdraw", _selected)>>
<<if _isDefense>>
<span class="raidv1-actionslot raidv1-actionslot--secondary"><span class="raidv1-tipwrap" data-tip="Abandon the camp, suffering stock and population losses based on the damage your warbands have taken."><<button "Withdraw">><<run setup.raidV1.handleBattleAction($raidV1, "withdraw", _selected)>><</button>></span></span>
<<else>>
<span class="raidv1-actionslot raidv1-actionslot--secondary"><span class="raidv1-tipwrap" data-tip="End the raid immediately and take the Withdrawal outcome."><<button "Withdraw">><<run setup.raidV1.handleBattleAction($raidV1, "withdraw", _selected)>><</button>></span></span>
<</if>>
<<else>>
<<if _isDefense and setup.raidV1.getWithdrawBlockReason($raidV1)>>
<<set _withdrawTip = setup.raidV1.getWithdrawBlockReason($raidV1)>><span class="raidv1-tipwrap"><span class="macro-button disabled">Withdraw</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_withdrawTip)>></span></span>
<<elseif _isDefense>>
<span class="raidv1-tipwrap" data-tip="Abandon the camp, suffering resource losses and casualties based on the damage your warbands have taken."><span class="macro-button disabled">Withdraw</span></span>
<<else>>
<span class="raidv1-tipwrap" data-tip="End the raid immediately and take the Withdrawal outcome."><span class="macro-button disabled">Withdraw</span></span>
<</if>>
<</if>>
</div>
<</capture>>
</div>
</div>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<if $currentEvent and $currentEvent.event and $currentEvent.event.sourceTribeId>>
<<set $raidCtx.sourceTribeId = $currentEvent.event.sourceTribeId>>
<<set $raidCtx.sourceTribeName = $currentEvent.event.sourceTribeName ?? "Unknown">>
<<set $raidCtx._active = true>>
<</if>>
<<set $raidV1DefenseSetup = $raidV1DefenseSetup ?? { prepChoice: "base", withdrawPlan: "normal", leader: "yourself" }>>
<<set _t = setup.raidV1.getTargetTribe($raidCtx.sourceTribeId)>>
<<if _t>>
<<set _fedAssist = setup.federation.rollDefenseAssistForRaid(_t, $raidCtx)>>
<</if>>
<<if setup.player && setup.player.recalcMilStr>><<run setup.player.recalcMilStr()>><</if>>
<<set _terrainData = setup.raidV1.getTerrainDataForCamp()>>
<<set _terrainLabel = _terrainData.label ?? "Open Ground">>
<<set _infiltrationBonus = _t ? setup.raidV1.getTribeOffenseInfiltrationBonus(_t) : 0>>
<<set _attackerFronts = _terrainData.frontCaps?.attacker ?? 3>>
<<set _defenderFronts = _terrainData.frontCaps?.defender ?? 3>>
<<set _ourMil = Number($playerMilStr ?? 0)>>
<<set _enemyMil = Number(_t?.stats?.milStr ?? _t?.milStr ?? 0)>>
<<set _ourPop = Math.floor(Number($pops ?? 0))>>
<<set _enemyPop = Math.floor(Number(_t?.stats?.population ?? 0))>>
<<set _ourBands = setup.raidV1.getAvailableWarbandCount(_ourPop)>>
<<set _enemyBands = setup.raidV1.getAvailableWarbandCount(_enemyPop)>>
<<set _assistData = $raidCtx.federationDefenseAssist ?? null>>
<<set _assistTribe = _assistData?.tribeId ? setup.tribes?.getById?.(_assistData.tribeId) : null>>
<<set _assistActive = !!(_assistTribe && Number(_assistTribe?.stats?.population ?? 0) > 0)>>
<<set _assistPop = _assistActive ? Math.max(0, Math.floor(Number(_assistTribe?.stats?.population ?? _assistData?.population ?? 0))) : 0>>
<<set _assistMil = _assistActive ? Math.max(1, Number(_assistTribe?.stats?.milStr ?? _assistTribe?.milStr ?? _assistData?.milStr ?? 0)) : 0>>
<<set _assistBands = _assistActive ? Math.max(1, setup.raidV1.getAvailableWarbandCount(_assistPop)) : 0>>
<<set _assistBandPop = _assistActive ? (setup.raidV1.getCommittedBandPopulations(_assistPop, _assistBands, 1)[0] || Math.min(_assistPop, setup.raidV1.populationPerWarband)) : 0>>
<<set _defenderMilForCommitment = Math.max(1, _ourMil + (_assistActive ? _assistMil : 0))>>
<<set _defenderBandsForCommitment = _ourBands + (_assistActive ? 1 : 0)>>
<<set _defenderPopForCommitment = _ourPop + (_assistActive ? _assistBandPop : 0)>>
<<set _enemyCommitmentKey = $raidCtx.attackerCommitment ?? setup.raidV1.resolveNpcAttackCommitment(_t, _enemyBands)>>
<<set $raidCtx.attackerCommitment = _enemyCommitmentKey>>
<<set _enemyCommitment = setup.raidV1.getCommitment(_enemyCommitmentKey)>>
<<set _enemyCommittedRaw = setup.raidV1.getCommittedWarbandCount(_enemyBands, _enemyCommitmentKey)>>
<<set _enemyCommittedCap = setup.raidV1.getDefenseRaidCommittedBandCap(_defenderPopForCommitment, _defenderMilForCommitment, _enemyPop, _enemyMil, _defenderBandsForCommitment, _enemyBands, _t)>>
<<set _enemyCommittedBands = Math.max(1, Math.min(_enemyCommittedRaw, _enemyCommittedCap))>>
<<set _fortified = !!setup.raidV1.isPlayerDefenseFortifiedReady()>>
<<set _prep = setup.raidV1.getPrepChoice($raidV1DefenseSetup.prepChoice)>>
<<set _prepDefs = setup.raidV1.getPrepChoiceDefs()>>
<<set _prepView = setup.raidV1.getDefensePrepSetupView($raidV1DefenseSetup.prepChoice)>>
<<set _withdrawPlan = setup.raidV1.getDefensePosture($raidV1DefenseSetup.withdrawPlan)>>
<<set _defenseLeaderView = setup.raidV1.getLeaderSetupView("yourself")>>
<</silently>>
<<if !_t>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title">Defense target missing</div>
<p>The raiding tribe could not be found, so the defense cannot begin.</p>
</div>
<div class="raidv1-actionrow">
<<button "Return to camp.">><<endMajorEvent>><</button>>
</div>
</div>
<<else>>
<div class="raidv1-wrap raidv1-setupgrid">
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--summary">
<div class="raidv1-title">Defend The Camp</div>
<div class="raidv1-subtitle">Raiders: <b><<print _t.name>></b> | Raid Scale: <b><<print _enemyCommitment.label>></b> | Camp Terrain: <b><<print _terrainLabel>></b></div>
<<if $raidCtx.federationDefenseAssist>>
<div class="raidv1-fedaid-notice">
<div class="raidv1-fedaid-kicker">Federation Aid</div>
<h3 class="raidv1-fedaid-title">You don't fight alone!</h3>
<p class="raidv1-fedaid-copy">The <<print $raidCtx.federationDefenseAssist.tribeName>> have come to our aid! +5 cohesion. Their warriors join your defense as an allied warband.</p>
</div>
<</if>>
<div class="raidv1-summarybar">
<div class="raidv1-optioncard"><span class="raidv1-label">Your Military Strength</span><span class="raidv1-value"><<print _ourMil>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Raider Military Strength</span><span class="raidv1-value"><<print _enemyMil>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Your Warbands</span><span class="raidv1-value"><<print _ourBands>></span></div>
<<if $raidCtx.federationDefenseAssist>><div class="raidv1-optioncard"><span class="raidv1-label">Federation Aid</span><span class="raidv1-value"><<print $raidCtx.federationDefenseAssist.tribeName>> (+1)</span></div><</if>>
<div class="raidv1-optioncard"><span class="raidv1-label">Raider Warbands</span><span class="raidv1-value"><<print _enemyCommittedBands>> committed / <<print _enemyBands>> available</span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Open Fronts</span><span class="raidv1-value">Attacker <<print _attackerFronts>> / Defender <<print _defenderFronts>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">AP Cost</span><span class="raidv1-value">None</span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Camp Status</span><span class="raidv1-value"><<if _fortified>>Fortified<<else>>Exposed<</if>></span></div>
</div>
<p class="raidv1-subtitle"><<if _fortified>>Your campworks are ready for the next defense, granting <b>+2 DEF</b> to every player warband when the raiders hit.<<else>>No campworks stand between your people and the first impact. The line will have to hold on nerve alone.<</if>></p>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--commitment">
<h3>Commitment</h3>
<div class="raidv1-chiprow">
<<if $raidV1DefenseSetup.withdrawPlan is "ordered_withdrawal">>
<span class="raidv1-tipwrap"><span class="raidv1-chip is-active">Ordered Withdrawal</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('ordered_withdrawal').tooltip)>></span></span>
<<else>>
<span class="raidv1-tipwrap"><<button "Ordered Withdrawal">><<set $raidV1DefenseSetup.withdrawPlan = "ordered_withdrawal">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('ordered_withdrawal').tooltip)>></span></span>
<</if>>
<<if $raidV1DefenseSetup.withdrawPlan is "normal">>
<span class="raidv1-tipwrap"><span class="raidv1-chip is-active">Normal</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('normal').tooltip)>></span></span>
<<else>>
<span class="raidv1-tipwrap"><<button "Normal">><<set $raidV1DefenseSetup.withdrawPlan = "normal">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('normal').tooltip)>></span></span>
<</if>>
<<if $raidV1DefenseSetup.withdrawPlan is "last_stand">>
<span class="raidv1-tipwrap"><span class="raidv1-chip is-active">Last Stand</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('last_stand').tooltip)>></span></span>
<<else>>
<span class="raidv1-tipwrap"><<button "Last Stand">><<set $raidV1DefenseSetup.withdrawPlan = "last_stand">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(setup.raidV1.getDefensePosture('last_stand').tooltip)>></span></span>
<</if>>
</div>
<div class="raidv1-selectionreadout"><div class="raidv1-checkformula"><span>Selected Posture</span><strong><<print _withdrawPlan.label>></strong></div><p class="raidv1-subtitle"><<print _withdrawPlan.desc>></p></div>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--approach">
<h3>Preparation</h3>
<div class="raidv1-chiprow">
<<if $raidV1DefenseSetup.prepChoice is "leadership">><span class="raidv1-tipwrap"><span class="raidv1-chip is-active"><<print _prepDefs.leadership.label>></span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.leadership.tooltip)>></span></span><<else>><span class="raidv1-tipwrap"><<button "Rouse Your Men">><<set $raidV1DefenseSetup.prepChoice = "leadership">><<set $raidCtx.prepChoice = "leadership">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.leadership.tooltip)>></span></span><</if>>
<<if $raidV1DefenseSetup.prepChoice is "strength">><span class="raidv1-tipwrap"><span class="raidv1-chip is-active"><<print _prepDefs.strength.label>></span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.strength.tooltip)>></span></span><<else>><span class="raidv1-tipwrap"><<button "Show Them Your Might">><<set $raidV1DefenseSetup.prepChoice = "strength">><<set $raidCtx.prepChoice = "strength">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.strength.tooltip)>></span></span><</if>>
<<if _prepDefs.spark.available>>
<<if $raidV1DefenseSetup.prepChoice is "spark">><span class="raidv1-tipwrap"><span class="raidv1-chip is-active"><<print _prepDefs.spark.label>> (<<print _prepDefs.spark.cost>> Belief)</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.spark.tooltip)>></span></span><<else>><span class="raidv1-tipwrap"><<button "Answer With Spark">><<set $raidV1DefenseSetup.prepChoice = "spark">><<set $raidCtx.prepChoice = "spark">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.spark.tooltip)>></span></span><</if>>
<<else>>
<span class="raidv1-tipwrap"><span class="raidv1-chip is-muted"><<print _prepDefs.spark.label>> (<<print _prepDefs.spark.cost>> Belief)</span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.spark.tooltip)>></span></span>
<</if>>
<<if $raidV1DefenseSetup.prepChoice is "base">><span class="raidv1-tipwrap"><span class="raidv1-chip is-active"><<print _prepDefs.base.label>></span><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.base.tooltip)>></span></span><<else>><span class="raidv1-tipwrap"><<button "No Time For Tricks">><<set $raidV1DefenseSetup.prepChoice = "base">><<set $raidCtx.prepChoice = "base">><<goto "Raid_V1_Defense_Setup">><</button>><span class="raidv1-tooltipbox"><<print setup.raidV1.toTooltipText(_prepDefs.base.tooltip)>></span></span><</if>>
</div>
<div class="raidv1-selectionreadout">
<div class="raidv1-checkformula"><span>Opening Check</span><strong><<print _prepView.formula>></strong></div>
<p class="raidv1-subtitle"><<print _prepView.description>></p>
<<if _prepView.outcomes>><p class="raidv1-outcomecopy"><<print _prepView.outcomes>></p><</if>>
</div>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--leader">
<h3>Leader</h3>
<div class="raidv1-leaderpriority"><span class="raidv1-leaderpriority-name"><<print _defenseLeaderView.name>></span><span class="raidv1-leaderpriority-stat">Leadership <b><<print _defenseLeaderView.leadership>></b></span></div>
<p class="raidv1-subtitle raidv1-secondary-stats"><<print _defenseLeaderView.secondary>></p>
<p class="raidv1-subtitle">You stand with the defenders in person. Defense costs no AP.</p>
</div>
<div class="raidv1-panel raidv1-actionrow raidv1-setupactions">
<<button "Begin Defense">>
<<run setup.raidV1.initDefense(Object.assign({}, $raidV1DefenseSetup, { targetId: _t.id }))>>
<<if $raidV1 and $raidV1.active>><<goto "Raid_V1_Battle">><<else>><<goto "Raid_V1_Defense_Setup">><</if>>
<</button>>
</div>
</div>
<</if>><<silently>>
<<if !$raidV1 or !$raidV1.active>><<if $raidCtx and $raidCtx._active>><<goto "Raid_V1_Defense_Setup">><<else>><<goto "Tribe_Info">><</if>><</if>>
<<if $raidV1 and $raidV1.questBattle>><<goto setup.raidV1.getResultPassage($raidV1)>><</if>>
<<run setup.raidV1.finalize($raidV1)>>
<<set _r = $raidV1.result ?? {}>>
<<set _isDefense = setup.raidV1.isDefense($raidV1)>>
<<set _leaderName = setup.raidV1.getLeaderName($raidV1)>>
<<set _terrainLabel = $raidV1.terrain?.label ?? "Open Ground">>
<<set _opponentName = $raidV1.targetName ?? "Enemy Tribe">>
<<set _friendlyLost = ($raidV1.stats.friendlyDestroyed ?? 0) + ($raidV1.stats.friendlyRouted ?? 0)>>
<<set _enemyLost = ($raidV1.stats.enemyDestroyed ?? 0) + ($raidV1.stats.enemyRouted ?? 0)>>
<<set _playerTotalCasualties = Number(_r.playerTotalCasualties ?? 0)>>
<<set _enemyTotalCasualties = Number(_r.enemyTotalCasualties ?? 0)>>
<</silently>>
<div class="raidv1-wrap raidv1-resultlayout">
<div class="raidv1-panel raidv1-resultpanel">
<div class="raidv1-resultheader">
<div class="raidv1-title"><<print _r.title ?? "Raid Complete">></div>
<p class="raidv1-resultlede"><<print _r.text>></p>
</div>
<div class="raidv1-summarybar raidv1-resultsummary">
<<if _isDefense>>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Camp Stock Lost</strong><span><<print _r.campFoodLost ?? 0>> food / <<print _r.campResLost ?? 0>> resources / <<print _r.campGoodsLost ?? 0>> goods</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Your Population Losses</strong><span><<print _playerTotalCasualties>> total — <<print _r.playerCasualties ?? 0>> killed / <<print _r.playerCaptives ?? 0>> captured</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Raider Population Losses</strong><span><<print _enemyTotalCasualties>> total — <<print _r.enemyCasualties ?? 0>> killed / <<print _r.enemyCaptives ?? 0>> captured by you</span></div>
<<else>>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Stock Gained</strong><span><<print _r.lootBundleSummary ?? "0 food / 0 resources / 0 goods">> (<<print _r.lootResPct ?? 0>>% of enemy stock)</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Captives Gained</strong><span><<print _r.enemyCaptives ?? 0>> (<<print _r.enemyCaptivesPct ?? 0>>% of enemy population)</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Your Population Losses</strong><span><<print _playerTotalCasualties>> total — <<print _r.playerCasualties ?? 0>> killed / <<print _r.playerCaptives ?? 0>> captured</span></div>
<div class="raidv1-resultcard raidv1-resultcard--headline"><strong>Enemy Population Losses</strong><span><<print _enemyTotalCasualties>> total — <<print _r.enemyCasualties ?? 0>> killed / <<print _r.enemyCaptives ?? 0>> captured</span></div>
<</if>>
<div class="raidv1-resultcard raidv1-resultcard--context"><strong>Battle End</strong><span><<print setup.raidV1.getBattleEndSummary($raidV1)>></span></div>
</div>
<div class="raidv1-resultbody">
<div class="raidv1-resulttags">
<span class="raidv1-resulttag is-strong">Leader: <<print _leaderName>></span>
<<if _isDefense>>
<span class="raidv1-resulttag">Preparation: <<print setup.raidV1.getPrepChoice($raidV1.setup.prepChoice).label>></span>
<span class="raidv1-resulttag">Posture: <<print setup.raidV1.getDefensePosture($raidV1.setup.withdrawPlan).label>></span>
<span class="raidv1-resulttag">Camp: <<if $raidV1.setup.fortifiedDefense>>Fortified<<else>>Unfortified<</if>></span>
<<if _r.federationDefenseAssist>><span class="raidv1-resulttag is-strong">Aid: <<print _r.federationDefenseAssist.tribeName>></span><</if>>
<<else>>
<span class="raidv1-resulttag">Commitment: <<print setup.raidV1.getCommitment($raidV1.setup.commitment).label>></span>
<span class="raidv1-resulttag">Approach: <<print setup.raidV1.getApproach($raidV1.setup.approach).label>></span>
<<if _r.federationRaidSupport>><span class="raidv1-resulttag is-strong">Support: <<print _r.federationRaidSupport.sponsorName>></span><</if>>
<<if _r.federationRaidQuest>><span class="raidv1-resulttag <<if _r.federationRaidQuest.success>>is-strong<<else>>is-warn<</if>>">Federation Quest: <<if _r.federationRaidQuest.success>>Complete<<else>>Failed<</if>></span><</if>>
<</if>>
<span class="raidv1-resulttag">Terrain: <<print _terrainLabel>></span>
<<if _r.leaderAftermath>><span class="raidv1-resulttag is-warn"><<print _r.leaderAftermath.title>> <<print _r.leaderAftermath.leaderName>></span><</if>>
<<if _r.leaderCorneredAftermath>><span class="raidv1-resulttag is-warn"><<print _r.leaderCorneredAftermath.title>> <<print _r.leaderCorneredAftermath.leaderName>></span><</if>>
<<if _r.leaderCorneredInjuries and _r.leaderCorneredInjuries.length>><span class="raidv1-resulttag is-warn">Leader injured</span><</if>>
<<if _r.relocation>><span class="raidv1-resulttag is-warn">Camp relocates after the raid</span><</if>>
<<if _r.collapse>><span class="raidv1-resulttag is-warn">Target tribe collapses</span><</if>>
</div>
<div class="raidv1-resultsection raidv1-resultsection--breakdown">
<h3>Battle Breakdown</h3>
<div class="raidv1-resultsection">
<h3>Player</h3>
<div class="raidv1-resultgrid">
<<if _isDefense>>
<div class="raidv1-resultcard"><strong>Food Lost</strong><span><<print _r.campFoodLost ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Resources Lost</strong><span><<print _r.campResLost ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Goods Lost</strong><span><<print _r.campGoodsLost ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Captured by Enemy</strong><span><<print _r.playerCaptives ?? 0>> (<<print _r.playerCaptivesPct ?? 0>>%)</span></div>
<div class="raidv1-resultcard"><strong>Killed</strong><span><<print _r.playerCasualties ?? 0>> (<<print _r.playerCasualtiesPct ?? 0>>%)</span></div>
<<else>>
<div class="raidv1-resultcard"><strong>Food Taken</strong><span><<print _r.lootFood ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Resources Taken</strong><span><<print _r.lootResources ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Goods Taken</strong><span><<print _r.lootGoods ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Captured by Enemy</strong><span><<print _r.playerCaptives ?? 0>> (<<print _r.playerCaptivesPct ?? 0>>%)</span></div>
<div class="raidv1-resultcard"><strong>Killed</strong><span><<print _r.playerCasualties ?? 0>> (<<print _r.playerCasualtiesPct ?? 0>>%)</span></div>
<</if>>
<div class="raidv1-resultcard"><strong>Stability Change</strong><span><<print _r.stabilityChange ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Zeal Change</strong><span><<print _r.zealChange ?? 0>></span></div>
<<if Number(_r.pridefulBeliefCost ?? 0) > 0>>
<div class="raidv1-resultcard"><strong>Prideful</strong><span>-<<print _r.pridefulBeliefCost>> Belief for withdrawing</span></div>
<<elseif _r.pridefulWithdrawFallback>>
<div class="raidv1-resultcard"><strong>Prideful</strong><span>Insufficient Belief: -10 Stability / -10 Zeal</span></div>
<</if>>
<div class="raidv1-resultcard"><strong>Warbands Lost</strong><span><<print _friendlyLost>></span></div>
</div>
</div>
<div class="raidv1-resultsection">
<h3><<print _opponentName>></h3>
<div class="raidv1-resultgrid">
<<if _isDefense>>
<div class="raidv1-resultcard"><strong>Resources Taken</strong><span><<print _r.tribeResGain ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Captured by You</strong><span><<print _r.enemyCaptives ?? 0>> (<<print _r.enemyCaptivesPct ?? 0>>%)</span></div>
<div class="raidv1-resultcard"><strong>Killed</strong><span><<print _r.enemyCasualties ?? 0>> (<<print _r.enemyCasualtiesPct ?? 0>>%)</span></div>
<<else>>
<div class="raidv1-resultcard"><strong>Stock Lost</strong><span><<print _r.lootStock ?? _r.lootRes ?? 0>> stock (<<print _r.lootResPct ?? 0>>%)</span></div>
<div class="raidv1-resultcard"><strong>Captured by You</strong><span><<print _r.enemyCaptives ?? 0>> (<<print _r.enemyCaptivesPct ?? 0>>%)</span></div>
<div class="raidv1-resultcard"><strong>Killed</strong><span><<print _r.enemyCasualties ?? 0>> (<<print _r.enemyCasualtiesPct ?? 0>>%)</span></div>
<</if>>
<div class="raidv1-resultcard"><strong>Warbands Broken</strong><span><<print _enemyLost>></span></div>
</div>
</div>
<<if !_isDefense and ["victory", "limited_victory"].includes($raidV1.outcome)>>
<div class="raidv1-resultsection">
<h3>Captured Stock</h3>
<div class="raidv1-resultgrid">
<div class="raidv1-resultcard"><strong>Items and Recipes</strong><span><<if _r.tradeLootSummary>><<print _r.tradeLootSummary>><<else>>No trade stock seized.<</if>></span></div>
</div>
</div>
<</if>>
<div class="raidv1-resultsection">
<h3>Wider Effects</h3>
<div class="raidv1-resultgrid">
<div class="raidv1-resultcard"><strong>Relations Change</strong><span><<print _r.relationChange ?? 0>></span></div>
<div class="raidv1-resultcard"><strong>Raid Strain</strong><span><<print _r.pressurePenalty ?? 0>></span></div>
<<if !_isDefense and Number(_r.bloodAspectGain ?? 0) > 0>>
<div class="raidv1-resultcard"><strong>Blood Signs</strong><span>+<<print _r.bloodAspectGain>></span></div>
<</if>>
<<if _r.leaderAftermath>>
<div class="raidv1-resultcard raidv1-resultcard--note"><strong><<print _r.leaderAftermath.title>></strong><span><<print _r.leaderAftermath.text>> <<if _r.leaderAftermath.effectText>><<print _r.leaderAftermath.effectText>><</if>></span></div>
<</if>>
<<if _r.leaderCorneredAftermath>>
<div class="raidv1-resultcard raidv1-resultcard--note"><strong><<print _r.leaderCorneredAftermath.title>></strong><span><<print _r.leaderCorneredAftermath.text>> <<if _r.leaderCorneredAftermath.effectText>><<print _r.leaderCorneredAftermath.effectText>><</if>></span></div>
<</if>>
<<if _r.leaderCorneredInjuries and _r.leaderCorneredInjuries.length>>
<div class="raidv1-resultcard raidv1-resultcard--note"><strong>Leader Injured</strong><span><<print _r.leaderCorneredInjuries.map(e => e.leaderName + ": " + e.effectText).join(" | ")>></span></div>
<</if>>
</div>
</div>
</div>
</div>
<div class="raidv1-actionrow raidv1-actionrow--result">
<span class="raidv1-actionslot raidv1-actionslot--secondary"><<button "View Battle Log">><<run setup.raidV1.openBattleLogDialog($raidV1)>><</button>></span>
<<if _isDefense>>
<span class="raidv1-actionslot raidv1-actionslot--primary"><<button "Tend to the aftermath.">><<run setup.raidV1.close()>><<set $raidCtx._active = false>><<set $raidCtx.federationDefenseAssist = null>><<set $raidV1DefenseSetup = null>><<endMajorEvent>><</button>></span>
<<else>>
<span class="raidv1-actionslot raidv1-actionslot--primary"><<button "Return to Tribe">><<run setup.raidV1.close()>><<goto "Tribe_Info">><</button>></span>
<</if>>
</div>
</div>
</div><<silently>>
<<set $raidV1Setup = $raidV1Setup ?? { commitment: "standard", approach: "warcry", leader: "yourself" }>>
<<run setup.raidV1.ensureSetupState()>>
<<set _t = setup.raidV1.getTargetTribe($raidTargetId ?? $activeTribeId)>>
<<set _raidAccess = (($raidTargetId ?? $activeTribeId) && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess($raidTargetId ?? $activeTribeId, { range: 2 }) : { canDirectInteract: true }>>
<<set _raidDirectAllowed = !!(_raidAccess && (_raidAccess.canDirectInteract ?? _raidAccess.available))>>
<<set _raidBlockLabel = _raidAccess?.blockLabel ?? "Unavailable">>
<<set _raidBlockTip = _raidAccess?.blockTip ?? "This direct camp action is not available right now.">>
<<set _raidBlockTurns = (setup.tribes && setup.tribes.getRaidBlockRemaining) ? setup.tribes.getRaidBlockRemaining($raidTargetId ?? $activeTribeId) : 0>>
<<set _peaceOathTurns = (setup.tribes && setup.tribes.getPeaceOathRemaining) ? setup.tribes.getPeaceOathRemaining($raidTargetId ?? $activeTribeId) : 0>>
<<if setup.player && setup.player.recalcMilStr>><<run setup.player.recalcMilStr()>><</if>>
<<set _ourMil = Number($playerMilStr ?? 0)>>
<<set _enemyMil = Number(_t?.stats?.milStr ?? _t?.milStr ?? 0)>>
<<set _ourPop = Math.floor(Number($pops ?? 0))>>
<<set _enemyPop = Math.floor(Number(_t?.stats?.population ?? 0))>>
<<set _terrainData = setup.raidV1.getTerrainDataForTarget(_t)>>
<<set _terrainLabel = _terrainData.label ?? "Open Ground">>
<<set _attackerFronts = _terrainData.frontCaps?.attacker ?? 3>>
<<set _defenderFronts = _terrainData.frontCaps?.defender ?? 3>>
<<set _availableBands = setup.raidV1.getAvailableWarbandCount(_ourPop)>>
<<set _enemyBands = setup.raidV1.getAvailableWarbandCount(_enemyPop)>>
<<set $raidV1Setup.commitment = setup.raidV1.sanitizeCommitmentChoice($raidV1Setup.commitment, _availableBands)>>
<<set _allowedCommitments = setup.raidV1.getAllowedCommitments(_availableBands)>>
<<set _selectedCommitment = setup.raidV1.getCommitment($raidV1Setup.commitment)>>
<<set _committedBands = setup.raidV1.getCommittedWarbandCount(_availableBands, $raidV1Setup.commitment)>>
<<set _apCost = setup.raidV1.getCommitmentApCost($raidV1Setup.commitment)>>
<<set _canLaunch = _raidDirectAllowed and Number($energy ?? 0) >= _apCost>>
<<set _minApCost = setup.raidV1.getMinimumCommitmentApCost(_availableBands)>>
<<set _beginRaidLabel = "Begin Raid (" + _apCost + " AP)">>
<<set _leaderOptions = setup.raidV1.getLeaderSetupOptions()>>
<<set $raidV1Setup.leader = setup.raidV1.sanitizeLeaderChoice($raidV1Setup.leader)>>
<<set _commitmentView = setup.raidV1.getCommitmentSetupView($raidV1Setup.commitment, _availableBands)>>
<<set _lightCommitmentView = setup.raidV1.getCommitmentSetupView("light", _availableBands)>>
<<set _standardCommitmentView = setup.raidV1.getCommitmentSetupView("standard", _availableBands)>>
<<set _fullCommitmentView = setup.raidV1.getCommitmentSetupView("full", _availableBands)>>
<<set _approachView = setup.raidV1.getApproachSetupView($raidV1Setup.approach, $raidV1Setup.leader)>>
<<set _leaderView = setup.raidV1.getLeaderSetupView($raidV1Setup.leader)>>
<<set _selLeaderOpt = setup.raidV1.getLeaderSetupOption($raidV1Setup.leader)>>
<<set _authorityLeaderEffect = setup.raidV1.getAuthorityLeaderEffect($raidV1Setup.leader)>>
<<set _leaderSetupEffect = setup.raidV1.getLeaderSetupEffect($raidV1Setup.leader)>>
<</silently>>
<<if !_t>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title">Raid target missing</div>
<p>You cannot launch a raid without a valid tribe target.</p>
</div>
<div class="raidv1-actionrow">
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<<elseif not _raidDirectAllowed>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title"><<print _raidBlockLabel>></div>
<p><<print _raidBlockTip>></p>
</div>
<div class="raidv1-actionrow">
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<<elseif _availableBands <= 0>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title">Party Raid</div>
<p>Your tribe does not have enough people ready to form a raiding warband.</p>
</div>
<div class="raidv1-actionrow">
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<<elseif _peaceOathTurns > 0>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title">Peace Oath Active</div>
<p>An oath of peace still binds your hand. You cannot launch a raid against this tribe for <b><<print _peaceOathTurns>></b> more turn<<if _peaceOathTurns isnot 1>>s<</if>>.</p>
</div>
<div class="raidv1-actionrow">
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<<elseif _raidBlockTurns > 0>>
<div class="raidv1-wrap">
<div class="raidv1-panel">
<div class="raidv1-title">Raid Locked</div>
<p>This tribe is still paying tribute under pressure. You cannot launch a raid against them for <b><<print _raidBlockTurns>></b> more turn<<if _raidBlockTurns is not 1>>s<</if>>.</p>
</div>
<div class="raidv1-actionrow">
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<<else>>
<div class="raidv1-wrap raidv1-setupgrid">
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--summary">
<div class="raidv1-title">Party Raid</div>
<div class="raidv1-subtitle">Target: <b><<print _t.name>></b> | Terrain: <b><<print _terrainLabel>></b></div>
<div class="raidv1-summarybar">
<div class="raidv1-optioncard"><span class="raidv1-label">Your Military Strength</span><span class="raidv1-value"><<print _ourMil>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Enemy Military Strength</span><span class="raidv1-value"><<print _enemyMil>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Your Warbands</span><span class="raidv1-value"><<print _committedBands>> committed / <<print _availableBands>> available</span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Enemy Warbands</span><span class="raidv1-value"><<print _enemyBands>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Open Fronts</span><span class="raidv1-value">Attacker <<print _attackerFronts>> / Defender <<print _defenderFronts>></span></div>
<div class="raidv1-optioncard"><span class="raidv1-label">Action Points</span><span class="raidv1-value"><<print _apCost>> cost / <<print $energy ?? 0>> available</span></div>
</div>
<<if _infiltrationBonus > 0>>
<p class="raidv1-subtitle">Your infiltrators already opened the way here. This raid will begin with <b>+<<print _infiltrationBonus>> ATK / +<<print _infiltrationBonus>> DEF / +<<print _infiltrationBonus>> Morale</b> on every player warband.</p>
<</if>>
<<if !_canLaunch>>
<p class="raidv1-subtitle">You need <b><<print _apCost>></b> AP for this commitment, but you can still switch to any legal option that costs <b><<print _minApCost>></b> AP or more.</p>
<</if>>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--commitment">
<h3>Commitment</h3>
<div class="raidv1-chiprow">
<<if _allowedCommitments.includes("light")>>
<<if $raidV1Setup.commitment is "light">><span class="raidv1-chip is-active">Light</span><<else>><<button "Light">><<set $raidV1Setup.commitment = "light">><<goto "Raid_V1_Setup">><</button>><</if>>
<<else>>
<span class="raidv1-chip is-muted raidv1-chip--locked">Light — requires <<print _lightCommitmentView.minimumWarbands>> warbands</span>
<</if>>
<<if _allowedCommitments.includes("standard")>>
<<if $raidV1Setup.commitment is "standard">><span class="raidv1-chip is-active">Standard</span><<else>><<button "Standard">><<set $raidV1Setup.commitment = "standard">><<goto "Raid_V1_Setup">><</button>><</if>>
<<else>>
<span class="raidv1-chip is-muted raidv1-chip--locked">Standard — requires <<print _standardCommitmentView.minimumWarbands>> warbands</span>
<</if>>
<<if _allowedCommitments.includes("full")>>
<<if $raidV1Setup.commitment is "full">><span class="raidv1-chip is-active">Full</span><<else>><<button "Full">><<set $raidV1Setup.commitment = "full">><<goto "Raid_V1_Setup">><</button>><</if>>
<<else>>
<span class="raidv1-chip is-muted raidv1-chip--locked">Full — requires <<print _fullCommitmentView.minimumWarbands>> warband</span>
<</if>>
</div>
<div class="raidv1-selectionreadout">
<div class="raidv1-selectionfacts"><span><b><<print _committedBands>></b> warband<<if _committedBands is not 1>>s<</if>></span><span><b><<print _apCost>></b> AP</span><span><b><<print _commitmentView.riskLabel>></b></span></div>
<p class="raidv1-subtitle"><<print _selectedCommitment.desc>></p>
</div>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--approach">
<h3>Approach</h3>
<div class="raidv1-chiprow">
<<if $raidV1Setup.approach is "warcry">><span class="raidv1-chip is-active">Warcry</span><<else>><<button "Warcry">><<set $raidV1Setup.approach = "warcry">><<goto "Raid_V1_Setup">><</button>><</if>>
<<if $raidV1Setup.approach is "ambush">><span class="raidv1-chip is-active">Ambush</span><<else>><<button "Ambush">><<set $raidV1Setup.approach = "ambush">><<goto "Raid_V1_Setup">><</button>><</if>>
<<if $raidV1Setup.approach is "rush">><span class="raidv1-chip is-active">Rush</span><<else>><<button "Rush">><<set $raidV1Setup.approach = "rush">><<goto "Raid_V1_Setup">><</button>><</if>>
</div>
<div class="raidv1-selectionreadout">
<div class="raidv1-checkformula"><span>Opening Check</span><strong><<print _approachView.formula>></strong></div>
<p class="raidv1-subtitle"><<print _approachView.description>></p>
<p class="raidv1-outcomecopy"><<print _approachView.outcomes>></p>
</div>
</div>
<div class="raidv1-panel raidv1-setuppanel raidv1-setuppanel--leader">
<h3>Leader</h3>
<details class="raidv1-leaderdrop">
<summary><span class="raidv1-leaderdrop-label"><<print _selLeaderOpt ? (_selLeaderOpt.menuLabel ?? _selLeaderOpt.label) : "Yourself">></span><span class="raidv1-leaderdrop-caret" aria-hidden="true">▾</span></summary>
<div class="raidv1-leaderdrop-menu" role="listbox">
<<for _i = 0; _i < _leaderOptions.length; _i++>>
<<set _leaderOpt = _leaderOptions[_i]>>
<<set _leaderMenuLabel = _leaderOpt.menuLabel ?? _leaderOpt.label>>
<<if $raidV1Setup.leader is _leaderOpt.key>><span class="raidv1-leaderitem is-selected"><span><<print _leaderMenuLabel>></span><span class="raidv1-leaderitem-check" aria-hidden="true">✓</span></span><<else>><<capture _leaderOpt _leaderMenuLabel>><<button _leaderMenuLabel>><<set $raidV1Setup.leader = _leaderOpt.key>><<goto "Raid_V1_Setup">><</button>><</capture>><</if>>
<</for>>
</div>
</details>
<div class="raidv1-leaderpriority"><span class="raidv1-leaderpriority-name"><<print _leaderView.name>></span><span class="raidv1-leaderpriority-stat">Leadership <b><<print _leaderView.leadership>></b></span></div>
<p class="raidv1-subtitle raidv1-secondary-stats"><<print _leaderView.secondary>></p>
<p class="raidv1-subtitle raidv1-leadereffect is-<<print _leaderSetupEffect.kind>>"><b><<print _leaderSetupEffect.label>>:</b> <<print _leaderSetupEffect.text>></p>
</div>
<div class="raidv1-panel raidv1-actionrow raidv1-setupactions">
<<if _canLaunch>>
<<button _beginRaidLabel>>
<<run setup.raidV1.init($raidV1Setup)>>
<<if $raidV1 and $raidV1.active>><<goto "Raid_V1_Battle">><<else>><<goto "Raid_V1_Setup">><</if>>
<</button>>
<<else>>
<span class="macro-button disabled">Begin Raid (<<print _apCost>> AP)</span>
<</if>>
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
</div>
<</if>><<silently>>
<<set _enc = $randomNpcAdultEncounter>>
<<if !_enc or !_enc.npcId>><<goto "Random_NPC_Interact">><</if>>
<<set _pid = _enc.npcId>>
<<set _npc = (setup.adultEncounter and setup.adultEncounter.getNpc) ? setup.adultEncounter.getNpc(_pid) : null>>
<<set _p = (setup.adultEncounter and setup.adultEncounter.getPerson) ? setup.adultEncounter.getPerson(_pid) : null>>
<<if !_npc or !(setup.adultEncounter and setup.adultEncounter.isEligible and setup.adultEncounter.isEligible(_npc, _p))>>
<<set $randomNpcInteractTab = "personal">>
<<goto "Random_NPC_Interact">>
<</if>>
<<set $activePersonId = _pid>>
<<set $personInfoId = _pid>>
<<set $selectedPersonId = _pid>>
<<set _name = _npc.name ?? _p?.name ?? "Camp follower">>
<<set _modeLabel = _enc.mode is "commanding" ? "Commanding Approach" : "Pleasant Approach">>
<<set _max = Number(_enc.meterMax ?? 100)>>
<<set _playerPct = Math.max(0, Math.min(100, Math.round((Number(_enc.playerMeter ?? 0) / _max) * 100)))>>
<<set _npcPct = Math.max(0, Math.min(100, Math.round((Number(_enc.npcMeter ?? 0) / _max) * 100)))>>
<<set _prefs = setup.adultEncounter.getPreferencePanelDefs(_pid)>>
<<set _pendingReveal = _enc.pendingPreferenceReveal ?? null>>
<<if ["foreplay", "intercourse", "special"].indexOf(_enc.actionTab ?? "") < 0>><<set _enc.actionTab = "foreplay">><</if>>
<<if _enc.forceClosePending>><<run setup.adultEncounter.endEncounter()>><<goto "Random_NPC_Interact">><</if>>
<</silently>>
<div class="adult-encounter-wrap">
<div class="adult-encounter-panel adult-meter-panel">
<div class="adult-section-title">Arousal</div>
<div class="adult-meter-stack">
<div class="adult-meter">
<div class="adult-meter-track"><div class="adult-meter-fill" style="height: 0%;"></div></div>
<div class="adult-meter-label"><span>You</span><strong><<print _playerPct>>%</strong></div>
</div>
<div class="adult-meter">
<div class="adult-meter-track"><div class="adult-meter-fill" style="height: 0%;"></div></div>
<div class="adult-meter-label"><span><<print _name>></span><strong><<print _npcPct>>%</strong></div>
</div>
</div>
</div>
<div class="adult-encounter-panel adult-scene-panel">
<div class="adult-scene-header">
<div class="adult-header-top">
<div class="adult-kicker-line"><span class="adult-kicker">Sexual Encounter</span><<if _enc.sceneAsset and _enc.sceneAsset.routeLabel>><span class="adult-route-tag"><<print _enc.sceneAsset.routeLabel>></span><</if>></div>
<div class="adult-exit"><<button "End Encounter">><<run setup.adultEncounter.endEncounter()>><<goto "Random_NPC_Interact">><</button>></div>
</div>
<div class="adult-identity">
<div class="adult-title"><<print _name>></div>
<div class="adult-approach"><<print _modeLabel>></div>
</div>
<div class="adult-header-divider"></div>
</div>
<div class="adult-scene-asset">
<<if _enc.sceneAsset and setup.adultEncounter.usesNsfwSceneMacro(_enc.sceneAsset)>>
<<if setup.adultEncounter.isNsfwEnabled() and !setup.adultEncounter.isLegacyArtHidden(_enc.sceneAsset)>>
<<nsfwimg _enc.sceneAsset.src>>
<<else>>
<div class="adult-scene-placeholder">IMG goes here</div>
<</if>>
<<else>>
<<print setup.adultEncounter.renderSceneAsset(_enc.sceneAsset)>>
<</if>>
</div>
<div class="adult-scene-log">
<div class="adult-scene-text"><<print _enc.sceneText>></div>
<<print setup.adultEncounter.renderActionCheck(_enc.actionCheck)>>
<<print setup.adultEncounter.renderClimaxEvents(_enc.climaxEvents)>>
<div class="adult-result-text"><<print _enc.resultText>></div>
</div>
</div>
<div class="adult-encounter-panel adult-pref-panel">
<div class="adult-section-title">Preferences</div>
<div class="adult-pref-list">
<<if _prefs.length is 0>>
<div class="adult-empty">No preferences have been discovered yet. Discover them by causing your partner to repeatedly climax.</div>
<<else>>
<div class="adult-pref-tags">
<<for _pi = 0; _pi < _prefs.length; _pi++>>
<<set _pref = _prefs[_pi]>>
<span class="adult-pref-chip"><<print _pref.label>></span>
<</for>>
</div>
<div class="adult-pref-descs">
<<for _pi = 0; _pi < _prefs.length; _pi++>>
<<set _pref = _prefs[_pi]>>
<div class="adult-pref-desc"><<print _pref.description>></div>
<</for>>
</div>
<</if>>
</div>
</div>
<div class="adult-action-panel">
<div class="adult-action-row">
<div>
<div class="adult-action-tabs" role="tablist" aria-label="Encounter actions">
<button type="button" class="adult-action-tab" data-adult-tab="foreplay" role="tab">Foreplay</button>
<button type="button" class="adult-action-tab" data-adult-tab="intercourse" role="tab">Intercourse</button>
<button type="button" class="adult-action-tab" data-adult-tab="special" role="tab">Special</button>
</div>
</div>
</div>
<div class="adult-action-group" data-adult-action-group="foreplay" role="tabpanel">
<<if _enc.ended>>
<span class="adult-disabled">Kiss</span>
<span class="adult-disabled">Grope</span>
<span class="adult-disabled">Fingering</span>
<<else>>
<<button "Kiss" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("kiss")>><</button>>
<<button "Grope" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("grope")>><</button>>
<<button "Fingering" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("fingering")>><</button>>
<</if>>
</div>
<div class="adult-action-group" data-adult-action-group="intercourse" role="tabpanel">
<<if _enc.ended>>
<span class="adult-disabled">Blowjob</span>
<span class="adult-disabled">Missionary</span>
<span class="adult-disabled">Cowgirl</span>
<span class="adult-disabled">Doggy</span>
<<else>>
<<button "Blowjob" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("blowjob")>><</button>>
<<button "Missionary" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("missionary")>><</button>>
<<button "Cowgirl" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("cowgirl")>><</button>>
<<button "Doggy" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("doggy")>><</button>>
<</if>>
</div>
<div class="adult-action-group" data-adult-action-group="special" role="tabpanel">
<<if _enc.ended>>
<span class="adult-disabled">Spank</span>
<span class="adult-disabled">Step</span>
<span class="adult-disabled">Facesitting</span>
<span class="adult-disabled">Titjob</span>
<span class="adult-disabled">Worship</span>
<span class="adult-disabled">Anal</span>
<<else>>
<<set _hasSpecialAction = false>>
<<if setup.adultEncounter.hasRevealedPreference(_pid, "painLover")>>
<<set _hasSpecialAction = true>>
<<button "Spank" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("spank")>><</button>>
<</if>>
<<if setup.adultEncounter.hasRevealedPreference(_pid, "dominant")>>
<<set _hasSpecialAction = true>>
<<button "Step" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("step")>><</button>>
<<button "Facesitting" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("face_sitting")>><</button>>
<</if>>
<<if setup.adultEncounter.hasRevealedPreference(_pid, "cleavageDevotee")>>
<<set _hasSpecialAction = true>>
<<button "Titjob" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("titjob")>><</button>>
<</if>>
<<if setup.adultEncounter.hasRevealedPreference(_pid, "submissive")>>
<<set _hasSpecialAction = true>>
<<button "Worship" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("worship")>><</button>>
<</if>>
<<if setup.adultEncounter.hasRevealedPreference(_pid, "analPrincess")>>
<<set _hasSpecialAction = true>>
<<button "Anal" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.performAction("anal")>><</button>>
<</if>>
<<if !_hasSpecialAction>>
<span class="adult-disabled">No special actions available</span>
<</if>>
<</if>>
</div>
</div>
<<if _pendingReveal>>
<div class="adult-reveal-overlay">
<div class="adult-reveal-box">
<div class="adult-reveal-title"><<print String(_name).toUpperCase()>> Preference Revealed</div>
<div class="adult-reveal-body">It seems <<print _name>> has some strange tastes...</div>
<div class="adult-reveal-pref">Preference: <<print _pendingReveal.label>></div>
<div class="adult-reveal-actions"><<button "Continue" "Random_NPC_Adult_Encounter">><<run setup.adultEncounter.clearPreferenceReveal()>><</button>></div>
</div>
</div>
<</if>>
</div>
<<run setup.adultEncounter.syncMeterFills()>><<silently>>
<<if setup.campNpcs and setup.campNpcs.ensureState>><<run setup.campNpcs.ensureState()>><</if>>
<<if setup.people and setup.people.syncCampNpcsToPeople>><<run setup.people.syncCampNpcsToPeople()>><</if>>
<<set _pid = $activePersonId ?? $personInfoId ?? $selectedPersonId ?? $personSelectedId>>
<<set _npc = (setup.campNpcs and setup.campNpcs.getById) ? setup.campNpcs.getById(_pid) : null>>
<<set _terminal = ($randomNpcTerminalResult and $randomNpcTerminalResult.npcId and String($randomNpcTerminalResult.npcId) is String(_pid ?? "")) ? $randomNpcTerminalResult : null>>
<<set _isTerminal = !_npc and !!_terminal>>
<<if !_npc and !_isTerminal>><<goto "Interact">><</if>>
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _pi = 0; _pi < $people.length; _pi++>>
<<if $people[_pi] and $people[_pi].id is _pid>>
<<set _p = $people[_pi]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !$randomNpcInteractTab>><<set $randomNpcInteractTab = "social">><</if>>
<<if ["social", "duties", "personal", "judgment"].indexOf($randomNpcInteractTab) < 0>><<set $randomNpcInteractTab = "social">><</if>>
<<if !$randomNpcInteractOutput>><<set $randomNpcInteractOutput = {}>><</if>>
<<if !$randomNpcGreetingVisit>><<set $randomNpcGreetingVisit = {}>><</if>>
<<if !_isTerminal and setup.relationships and setup.relationships.consumePendingPartnerReactionHtml>><<set _partnerReactionHtml = setup.relationships.consumePendingPartnerReactionHtml(_pid)>><<if _partnerReactionHtml>><<set $randomNpcInteractOutput[_pid] = _partnerReactionHtml>><</if>><</if>>
<<set _name = _isTerminal ? (_terminal.name ?? "Camp follower") : (_npc.name ?? _p?.name ?? "Camp follower")>>
<<set _positionLabel = _isTerminal ? "" : ((setup.campPositions and setup.campPositions.getNpcPositionLabel) ? setup.campPositions.getNpcPositionLabel(_pid) : "None")>>
<<set _titleSuffix = (!_isTerminal and _positionLabel and String(_positionLabel) !== "None") ? _positionLabel : "">>
<<set _gender = _isTerminal ? (_terminal.gender ?? "unknown") : (_npc.gender ?? _p?.gender ?? "unknown")>>
<<set _ageLabel = _isTerminal ? (_terminal.ageLabel ?? "Unknown") : ((setup.npcAge and setup.npcAge.getLabel) ? setup.npcAge.getLabel(_npc) : "Unknown")>>
<<set _adultInteractionAllowed = _isTerminal ? false : ((setup.npcAge and setup.npcAge.canUseSexualInteraction) ? setup.npcAge.canUseSexualInteraction(_npc) : true)>>
<<set _adultEncounterEligible = _isTerminal ? false : ((setup.adultEncounter and setup.adultEncounter.isEligible) ? setup.adultEncounter.isEligible(_npc, _p) : false)>>
<<set _adultEncounterAttempted = _isTerminal ? true : ((setup.adultEncounter and setup.adultEncounter.hasAttemptedThisTurn) ? setup.adultEncounter.hasAttemptedThisTurn(_pid) : true)>>
<<set _adultApproachState = _isTerminal ? null : ((setup.adultEncounter and setup.adultEncounter.getApproachState) ? setup.adultEncounter.getApproachState(_pid) : null)>>
<<set _enlightenMenuOpen = !_isTerminal and String($randomNpcEnlightenMenu ?? "") is String(_pid ?? "")>>
<<set _enlightenHasAction = Number($energy ?? 0) >= 1>>
<<set _objective = (_gender is "female") ? "her" : ((_gender is "male") ? "him" : "them")>>
<<set _love = _isTerminal ? 0 : Number(_p ? (_p.love ?? _npc.love ?? 0) : (_npc.love ?? 0))>>
<<set _trust = _isTerminal ? 0 : Number(_p ? (_p.trust ?? _npc.trust ?? 0) : (_npc.trust ?? 0))>>
<<set _obed = _isTerminal ? 0 : Number(_p ? (_p.obedience ?? _p.influence ?? _npc.obedience ?? _npc.influence ?? 0) : (_npc.obedience ?? _npc.influence ?? 0))>>
<<set _bondLabel = (_gender is "female") ? "Love" : "Trust">>
<<set _bondValue = (_gender is "female") ? _love : _trust>>
<<set _swayStatus = (setup.npcInteractions and setup.npcInteractions.getSwayStatus) ? setup.npcInteractions.getSwayStatus(_pid) : { canUse: false, cost: 5, reason: "Sway is unavailable." }>>
<<set _mendStatus = (setup.npcInteractions and setup.npcInteractions.getMendWoundsStatus) ? setup.npcInteractions.getMendWoundsStatus(_pid, _npc, _p) : { canUse: false, cost: 10, reason: "Mend Wounds is unavailable." }>>
<<set _opening = _isTerminal ? (_terminal.html ?? "They are gone.") : ((setup.npcGreetings and setup.npcGreetings.getVisitGreeting) ? setup.npcGreetings.getVisitGreeting(_pid, _npc, _p) : (_name + " waits at the entrance of your tent, curious why you called " + _objective + " here."))>>
<<set _response = _isTerminal ? (_terminal.html ?? _opening) : ($randomNpcInteractOutput[_pid] ?? _opening)>>
<</silently>>
<div class="campfollow-wrap">
<div class="campfollow-head">
<div>
<div class="campfollow-kicker">Camp Follower</div>
<div class="campfollow-title"><<print _name>><<if _titleSuffix>> — <<print _titleSuffix>><</if>></div>
<div class="campfollow-bonds"><<print _ageLabel>> • <<print _bondLabel>> <<print _bondValue>> • Obedience <<print _obed>></div>
</div>
<div class="campfollow-return">
<<button "Return">>
<<if setup.npcInteractions and setup.npcInteractions.clearTerminalResult>><<run setup.npcInteractions.clearTerminalResult()>><</if>>
<<set $interactPeopleTab = "followers">>
<<goto "Interact">>
<</button>>
</div>
</div>
<div class="campfollow-response">
<div class="campfollow-section-label">Response</div>
<div class="campfollow-response-text"><<print _response>></div>
</div>
<<if _isTerminal>>
<div class="campfollow-actions">
<div class="campfollow-section-label">Actions</div>
<div class="campfollow-action-grid">
<span class="macro-button disabled campfollow-disabled" aria-disabled="true">No further actions</span>
</div>
</div>
<<else>>
<div class="campfollow-tabs">
<<if $randomNpcInteractTab is "social">><span class="campfollow-tab is-active">Social</span><<else>><<button "Social" "Random_NPC_Interact">><<set $randomNpcInteractTab = "social">><</button>><</if>>
<<if $randomNpcInteractTab is "duties">><span class="campfollow-tab is-active">Powers</span><<else>><<button "Powers" "Random_NPC_Interact">><<set $randomNpcInteractTab = "duties">><</button>><</if>>
<<if $randomNpcInteractTab is "personal">><span class="campfollow-tab is-active">Personal</span><<else>><<button "Personal" "Random_NPC_Interact">><<set $randomNpcInteractTab = "personal">><</button>><</if>>
<<if $randomNpcInteractTab is "judgment">><span class="campfollow-tab is-active">Judgment</span><<else>><<button "Judgment" "Random_NPC_Interact">><<set $randomNpcInteractTab = "judgment">><</button>><</if>>
</div>
<div class="campfollow-actions">
<div class="campfollow-section-label">Actions</div>
<div class="campfollow-action-grid">
<<capture _pid _name _npc _p _swayStatus _mendStatus>>
<<if $randomNpcInteractTab is "social">>
<<if setup.npcInteractions and setup.npcInteractions.hasComplimentedThisTurn and setup.npcInteractions.hasComplimentedThisTurn(_pid)>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Already used on this follower this turn." aria-disabled="true" tabindex="0">Compliment</span>
<<else>>
<<button "Compliment" "Random_NPC_Interact">><<run setup.npcInteractions.doCompliment(_pid, _npc, _p)>><</button>>
<</if>>
<<if setup.npcInteractions and setup.npcInteractions.hasGiftedThisTurn and setup.npcInteractions.hasGiftedThisTurn(_pid)>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Gift already used on this follower this turn." aria-disabled="true" tabindex="0">Gift</span>
<<elseif Number($goods ?? 0) >= 5>>
<<button "Gift" "Random_NPC_Interact">><<run setup.npcInteractions.doGift(_pid, _npc, _p)>><</button>>
<<else>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 5 Goods." aria-disabled="true" tabindex="0">Gift</span>
<</if>>
<span class="macro-button disabled campfollow-disabled campfollow-tooltip" data-tip="Ask is disabled until the conversation system is ready." aria-disabled="true" tabindex="0">Ask</span>
<<if setup.npcInteractions and setup.npcInteractions.hasIntimidatedThisTurn and setup.npcInteractions.hasIntimidatedThisTurn(_pid)>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Already used on this follower this turn." aria-disabled="true" tabindex="0">Intimidate</span>
<<else>>
<<button "Intimidate" "Random_NPC_Interact">><<run setup.npcInteractions.doIntimidate(_pid, _npc, _p)>><</button>>
<</if>>
<<elseif $randomNpcInteractTab is "duties">>
<<if _swayStatus.canUse>>
<span class="campfollow-sway-wrap campfollow-tooltip" data-tip="Costs 5 Belief. Uses Sway on this follower and can only be used once per turn."><<button "Sway">><<run setup.npcInteractions.doSway(_pid, _npc, _p)>><</button>></span>
<<elseif _swayStatus.used>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Sway has already been used on this follower this turn." aria-disabled="true" tabindex="0">Sway (5)</span>
<<elseif not _swayStatus.owned>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="You have not acquired Sway." aria-disabled="true" tabindex="0">Sway (5)</span>
<<else>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Costs 5 Belief. You do not have enough." aria-disabled="true" tabindex="0">Sway (5)</span>
<</if>>
<<if _mendStatus.canUse>>
<span class="campfollow-sway-wrap campfollow-tooltip" data-tip="Costs 10 Belief. Removes Injured, Love +10, Hearth Signs +4, Blood Signs -2."><<button "Mend Wounds" "Random_NPC_Interact">><<run setup.npcInteractions.doMendWounds(_pid, _npc, _p)>><</button>></span>
<<elseif not _mendStatus.owned>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="You have not acquired Mend Wounds." aria-disabled="true" tabindex="0">Mend Wounds (10)</span>
<<elseif not _mendStatus.injured>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="This follower has no injury for Mend Wounds to close." aria-disabled="true" tabindex="0">Mend Wounds (10)</span>
<<else>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Costs 10 Belief. You do not have enough." aria-disabled="true" tabindex="0">Mend Wounds (10)</span>
<</if>>
<<elseif $randomNpcInteractTab is "personal">>
<<if _enlightenMenuOpen>>
<<if _enlightenHasAction>>
<<button "Wisdom" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "wisdom")>><</button>>
<<button "Strength" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "strength")>><</button>>
<<button "Endurance" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "endurance")>><</button>>
<<button "Leadership" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "leadership")>><</button>>
<<button "Charisma" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "charisma")>><</button>>
<<button "Stewardship" "Random_NPC_Interact">><<run setup.npcInteractions.doEnlighten(_pid, _npc, _p, "stewardship")>><</button>>
<<else>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Wisdom</span>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Strength</span>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Endurance</span>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Leadership</span>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Charisma</span>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Stewardship</span>
<</if>>
<<button "Return" "Random_NPC_Interact">><<run setup.npcInteractions.closeEnlighten()>><</button>>
<<elseif _adultApproachState>>
<<if _adultApproachState.state is "success">>
<<button "Continue">><<run setup.adultEncounter.beginEncounter(_pid, _npc, _p)>><<goto "Random_NPC_Adult_Encounter">><</button>>
<<button "Return" "Random_NPC_Interact">><<run setup.adultEncounter.clearApproach()>><</button>>
<<elseif _adultEncounterEligible>>
<<button "Pleasant" "Random_NPC_Interact">><<run setup.adultEncounter.resolveApproach(_pid, _npc, _p, "pleasant")>><</button>>
<<button "Commanding" "Random_NPC_Interact">><<run setup.adultEncounter.resolveApproach(_pid, _npc, _p, "commanding")>><</button>>
<<button "Return" "Random_NPC_Interact">><<run setup.adultEncounter.clearApproach()>><</button>>
<<else>>
<span class="macro-button disabled campfollow-disabled" title="Unavailable for this follower." aria-disabled="true">Sex</span>
<</if>>
<<else>>
<<if _enlightenHasAction>>
<<button "Enlighten" "Random_NPC_Interact">><<run setup.npcInteractions.openEnlighten(_pid)>><</button>>
<<else>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Requires 1 Action Point." aria-disabled="true" tabindex="0">Enlighten</span>
<</if>>
<<if _gender is "female">>
<<if !_adultInteractionAllowed>>
<span class="macro-button disabled campfollow-disabled" title="Unavailable for this age group." aria-disabled="true">Sex</span>
<<elseif _adultEncounterAttempted>>
<span class="campfollow-used-label campfollow-tooltip" data-tip="Already attempted with this follower this turn." aria-disabled="true" tabindex="0">Sex</span>
<<elseif _adultEncounterEligible>>
<<button "Sex" "Random_NPC_Interact">><<run setup.adultEncounter.openApproach(_pid, _npc, _p)>><</button>>
<<else>>
<span class="macro-button disabled campfollow-disabled" title="Unavailable for this follower." aria-disabled="true">Sex</span>
<</if>>
<</if>>
<</if>>
<<elseif $randomNpcInteractTab is "judgment">>
<<button "Assignment">><<set $activePersonId = _pid>><<set $personInfoId = _pid>><<set $campPositionAssignmentReturn = "Random_NPC_Interact">><<goto "Camp_Position_Assignment">><</button>>
<<button "Imprison">><<run setup.npcInteractions.doImprison(_pid, _npc, _p)>><<goto "Prisoner_Interact">><</button>>
<<button "Dismiss" "Random_NPC_Interact">><<run setup.npcInteractions.doDismiss(_pid, _npc, _p)>><</button>>
<<button "Kill" "Random_NPC_Interact">><<run setup.npcInteractions.doKill(_pid, _npc, _p)>><</button>>
<</if>>
<</capture>>
</div>
</div>
<</if>>
</div><<nobr>>
<div class="relationships-shell">
<header class="relationships-header">
<div>
<span class="relationships-kicker">Camp People</span>
<h1 class="relationships-title">Relationships</h1>
</div>
<p class="relationships-lead">The people closest to your fire carry ties of blood, loyalty, resentment, and memory.</p>
</header>
<div class="relationships-mount">
<<print setup.relationships && setup.relationships.renderTrackerHtml ? setup.relationships.renderTrackerHtml() : '<div class="relationships-empty"><strong>Relationships unavailable</strong><span>The relationship tracker could not be prepared.</span></div>'>>
</div>
<footer class="relationships-footer">
<p class="relationships-note">Only known sibling ties and rivalries are tracked for now.</p>
<button type="button" class="relationships-return" onclick="SugarCube.setup.relationships.exitTracker()">Return</button>
</footer>
</div>
<</nobr>><div class="report-wrap report-receipt">
<<silently>>
/* Safe report object + safe sub-objects */
<<set _r = $turnReport ?? {}>>
<<set _food = _r.food ?? {}>>
<<set _pop = _r.population ?? {}>>
<<set _res = _r.resources ?? {}>>
<<set _goods = _r.goods ?? {}>>
<<set _belief = _r.belief ?? {}>>
<<set _stab = _r.stability ?? {}>>
<<set _zeal = _r.zeal ?? {}>>
<<set _season = _r.season ?? {}>>
/* Defensive numeric getters */
<<set _fp = Number(_food.passive ?? 0)>>
<<set _fh = Number(_food.hunting ?? 0)>>
<<set _fn = Number(_food.needs ?? 0)>>
<<set _ff = Number(_food.followers ?? 0)>>
<<set _fPrisoners = Number(_food.prisoners ?? 0)>>
<<set _fPopNeed = Number(_food.popNeeds ?? Math.max(0, _fn - _ff - _fPrisoners))>>
<<set _fo = Number(_food.other ?? 0)>>
<<set _ft = Number(_food.total ?? (Number($food ?? 0)))>>
<<set _fGame = String(_food.game ?? "none")>>
<<set _fGameLabel = _fGame.charAt(0).toUpperCase() + _fGame.slice(1)>>
<<set _seasonFull = String(_season.fullLabel ?? $currentSeasonFullLabel ?? "Unknown Season")>>
<<set _pp = Number(_pop.procreation ?? 0)>>
<<set _pg = Number(_pop.netGrowth ?? 0)>>
<<set _pd = Number(_pop.netDecline ?? 0)>>
<<set _pother = Number(_pop.other ?? 0)>>
<<set _pt = Number(_pop.total ?? (Number($pops ?? 0)))>>
/* Resources: support both newer keys and legacy aliases */
<<set _rp = Number(_res.passive ?? 0)>>
<<set _rg = Number(_res.gathering ?? _res.crafting ?? 0)>>
<<set _rscout = Number(_res.scouting ?? 0)>>
<<set _rspent = Number(_res.spent ?? 0)>>
<<set _ro = Number(_res.other ?? 0)>>
<<set _rt = Number(_res.total ?? (Number($resources ?? 0)))>>
/* Goods */
<<set _gc = Number(_goods.crafted ?? 0)>>
<<set _gspent = Number(_goods.spent ?? 0)>>
<<set _gdelta = Number(_goods.change ?? 0)>>
<<set _go = Number(_goods.other ?? (_gdelta - _gc + _gspent))>>
<<set _gt = Number(_goods.total ?? (Number($goods ?? 0)))>>
/* Belief */
<<set _bg = Number(_belief.gained ?? 0)>>
<<set _bo = Number(_belief.other ?? 0)>>
<<set _bt = Number(_belief.total ?? (Number($belief ?? 0)))>>
/* Stability */
<<set _stTrain = Number(_stab.training ?? 0)>>
<<set _stCouncil = Number(_stab.council ?? 0)>>
<<set _stFort = Number(_stab.fortify ?? 0)>>
<<set _stRel = Number(_stab.relocate ?? 0)>>
<<set _stOther = Number(_stab.other ?? 0)>>
<<set _stTotal = Number(_stab.total ?? (Number($stability ?? 0)))>>
/* Zeal */
<<set _zOmens = Number(_zeal.omens ?? 0)>>
<<set _zOther = Number(_zeal.other ?? 0)>>
<<set _zTotal = Number(_zeal.total ?? (Number($zeal ?? 0)))>>
/* Helpers */
<<set _pos = (n) => (Number(n) > 0 ? Number(n) : 0)>>
<<set _neg = (n) => (Number(n) < 0 ? Math.abs(Number(n)) : 0)>>
<<set _abs = (n) => Math.abs(Number(n ?? 0))>>
<<set _tone = (n) => (Number(n) > 0 ? "pos" : (Number(n) < 0 ? "neg" : "neutral"))>>
<<set _signed = (n) => ((Number(n) > 0 ? "+" : "") + Number(n))>>
<<set _focusFromTitle = (title) => ({
food: "food",
resources: "resources",
goods: "goods",
stability: "stability",
zeal: "zeal",
population: "pops",
belief: "belief"
}[String(title ?? "").toLowerCase()] ?? "food")>>
<<set _mkLine = (kind, label, value, text, always) => ({
kind: kind,
label: label,
value: Number(value ?? 0),
text: text,
tone: _tone(value),
show: !!always || Number(value ?? 0) !== 0
})>>
/* FOOD */
<<set _foodG = (_fp + _fh + _pos(_fo))>>
<<set _foodL = (_fn + _neg(_fo))>>
<<set _foodNet = (_foodG - _foodL)>>
<<set _foodCur = (_ft - _foodNet)>>
/* RESOURCES */
<<set _resG = (_rp + _rg + _rscout + _pos(_ro))>>
<<set _resL = (_rspent + _neg(_ro))>>
<<set _resNet = (_resG - _resL)>>
<<set _resCur = (_rt - _resNet)>>
/* GOODS */
<<set _goodsG = (_gc + _pos(_go))>>
<<set _goodsL = (_gspent + _neg(_go))>>
<<set _goodsNet = Number(_goods.change ?? (_goodsG - _goodsL))>>
<<set _goodsCur = (_gt - _goodsNet)>>
/* POPS */
<<set _popsNet = (_pg - _pd)>>
<<set _popsCur = (_pt - _popsNet)>>
/* BELIEF */
<<set _beliefG = (_bg + _pos(_bo))>>
<<set _beliefL = (_neg(_bo))>>
<<set _beliefNet = (_beliefG - _beliefL)>>
<<set _beliefCur = (_bt - _beliefNet)>>
/* STABILITY */
<<set _stabG = (_stTrain + _stCouncil + _stFort + _stRel + _pos(_stOther))>>
<<set _stabL = (_neg(_stOther))>>
<<set _stabNet = (_stabG - _stabL)>>
<<set _stabCur = (_stTotal - _stabNet)>>
/* ZEAL */
<<set _zealG = (_zOmens + _pos(_zOther))>>
<<set _zealL = (_neg(_zOther))>>
<<set _zealNet = (_zealG - _zealL)>>
<<set _zealCur = (_zTotal - _zealNet)>>
<<set _netMap = [
{ title: "Food", value: _foodNet },
{ title: "Resources", value: _resNet },
{ title: "Goods", value: _goodsNet },
{ title: "Stability", value: _stabNet },
{ title: "Zeal", value: _zealNet },
{ title: "Population", value: _popsNet },
{ title: "Belief", value: _beliefNet }
]>>
<<set _gainLeaders = _netMap.filter((entry) => entry.value > 0).sort((a, b) => b.value - a.value)>>
<<set _lossLeaders = _netMap.filter((entry) => entry.value < 0).sort((a, b) => a.value - b.value)>>
<<set _strongestGain = _gainLeaders.length ? _gainLeaders[0] : null>>
<<set _sharpestLoss = _lossLeaders.length ? _lossLeaders[0] : null>>
<<set _summaryText = "The season passed with little change, and the tribe held its ground.">>
<<if _strongestGain and _sharpestLoss>>
<<set _summaryText = "The tribe's greatest rise came in " + _strongestGain.title.toLowerCase() + ", while the hardest strain fell on " + _sharpestLoss.title.toLowerCase() + ".">>
<<elseif _strongestGain>>
<<set _summaryText = "The tribe gathered strength above all in " + _strongestGain.title.toLowerCase() + " this turn.">>
<<elseif _sharpestLoss>>
<<set _summaryText = "The season pressed hardest against your " + _sharpestLoss.title.toLowerCase() + ".">>
<</if>>
<<set _defaultFocus = _sharpestLoss ? _focusFromTitle(_sharpestLoss.title) : (_strongestGain ? _focusFromTitle(_strongestGain.title) : "food")>>
<<set _focusKeys = ["food", "resources", "goods", "stability", "zeal", "pops", "belief"]>>
<<if !_focusKeys.includes(String($reportFocus ?? ""))>>
<<set $reportFocus = _defaultFocus>>
<</if>>
<<set _foodLines = [
_mkLine("Passive", "Passive Food", _fp, "Season: " + _seasonFull + " | Tile: " + _fGameLabel + " Game", true),
_mkLine("Situational", "Hunt Game Bonus", _fh, "Extra food pushed on top of passive generation this turn.", false),
_mkLine("Upkeep", "Food Upkeep", -_fPopNeed, "Population consumption paid this turn.", true),
_mkLine("Upkeep", "Followers", -_ff, "Camp follower upkeep paid this turn.", true),
_mkLine("Upkeep", "Prisoners", -_fPrisoners, "Prisoner rations paid this turn.", true),
_mkLine("Situational", "Other Food Changes", _fo, "Events, raids, trades, spoilage, and other food shifts.", false)
].filter((entry) => entry.show)>>
<<set _resourceLines = [
_mkLine("Passive", "Passive Gathering", _rp, "Materials gathered by the camp over the turn.", true),
_mkLine("Plans", "Gathering Plans", _rg, "Resources brought in through direct gathering work.", true),
_mkLine("Situational", "Scout Salvage", _rscout, "Small resource gains recovered through scouting and salvage.", false),
_mkLine("Upkeep", "Position Upkeep", -_rspent, "Resources consumed by staffed camp positions.", false),
_mkLine("Situational", "Other Resource Changes", _ro, "Events and edge-case shifts not covered by your plans.", false)
].filter((entry) => entry.show)>>
<<set _goodsLines = [
_mkLine("Plans", "Crafted Goods", _gc, "Finished goods produced through crafting this turn.", true),
_mkLine("Loss", "Goods Spent", -_gspent, "Goods consumed, traded, or otherwise spent.", false),
_mkLine("Situational", "Other Goods Changes", _go, "Events and edge-case changes to your stockpile.", false)
].filter((entry) => entry.show)>>
<<set _stabilityLines = [
_mkLine("Plans", "Train Hunters", _stTrain, "Training sharpened discipline and camp readiness.", false),
_mkLine("Plans", "Hold Council", _stCouncil, "Council work steadied your people and reduced strain.", false),
_mkLine("Plans", "Fortify Camp", _stFort, "Camp defenses improved order and confidence.", false),
_mkLine("Plans", "Relocate Camp", _stRel, "Migration work changed how secure the camp felt.", false),
_mkLine("Situational", "Other Stability Changes", _stOther, "Events, shocks, and side effects that touched stability.", false)
].filter((entry) => entry.show)>>
<<set _zealLines = [
_mkLine("Plans", "Interpret Omens", _zOmens, "Ritual and omen-reading changed the tribes fervor.", false),
_mkLine("Situational", "Other Zeal Changes", _zOther, "Events and outcomes that stirred fervor or doubt.", true)
].filter((entry) => entry.show)>>
<<set _popLines = [
_mkLine("Plans", "Procreation", _pp, "Population added through deliberate family effort.", false),
_mkLine("Situational", "Other Population Changes", _pother, "Events and edge-case shifts that changed tribe size.", false)
].filter((entry) => entry.show)>>
<<set _beliefLines = [
_mkLine("Turn Result", "Belief Gained", _bg, "Direct change to belief from the turns outcomes.", true),
_mkLine("Situational", "Other Belief Changes", _bo, "Additional spiritual shifts not covered by the main gain line.", false)
].filter((entry) => entry.show)>>
<<set _reportCategories = {
food: {
key: "food",
label: "Food",
total: _ft,
start: _foodCur,
net: _foodNet,
tone: _tone(_foodNet),
summary: "Food was shaped by passive gathering, hunting, upkeep, and any turn events that altered stores.",
lines: _foodLines
},
resources: {
key: "resources",
label: "Resources",
total: _rt,
start: _resCur,
net: _resNet,
tone: _tone(_resNet),
summary: "Resources mostly reflect gathering work, scouting salvage, and any incidental gains or losses.",
lines: _resourceLines
},
goods: {
key: "goods",
label: "Goods",
total: _gt,
start: _goodsCur,
net: _goodsNet,
tone: _tone(_goodsNet),
summary: "Goods track finished crafting output and any unusual spending or loss to the stockpile.",
lines: _goodsLines
},
stability: {
key: "stability",
label: "Stability",
total: _stTotal,
start: _stabCur,
net: _stabNet,
tone: _tone(_stabNet),
summary: "Stability reflects how well your plans and events held the camp together this turn.",
lines: _stabilityLines
},
zeal: {
key: "zeal",
label: "Zeal",
total: _zTotal,
start: _zealCur,
net: _zealNet,
tone: _tone(_zealNet),
summary: "Zeal rose or fell through omens, ritual work, and whatever stirred your people this turn.",
lines: _zealLines
},
pops: {
key: "pops",
label: "Population",
total: _pt,
start: _popsCur,
net: _popsNet,
tone: _tone(_popsNet),
summary: "Population tracks growth, deaths, and any unusual shifts in tribe size.",
lines: _popLines
},
belief: {
key: "belief",
label: "Belief",
total: _bt,
start: _beliefCur,
net: _beliefNet,
tone: _tone(_beliefNet),
summary: "Belief captures the spiritual momentum left behind by the turns outcomes.",
lines: _beliefLines
}
}>>
<<set _overviewRows = [
_reportCategories.food,
_reportCategories.resources,
_reportCategories.goods,
_reportCategories.stability,
_reportCategories.zeal,
_reportCategories.pops,
_reportCategories.belief
]>>
<<set _topChanges = _overviewRows.filter((entry) => entry.net !== 0).sort((a, b) => _abs(b.net) - _abs(a.net))>>
<<set _alerts = []>>
<<if _foodNet < 0>>
<<run _alerts.push({ title: "Food is slipping", text: "Upkeep and other pressures beat your incoming food by " + _abs(_foodNet) + " this turn." })>>
<</if>>
<<if _resNet < 0>>
<<run _alerts.push({ title: "Resources tightened", text: "You lost or spent more resources than you brought in this turn." })>>
<</if>>
<<if _stabNet < 0>>
<<run _alerts.push({ title: "Camp order weakened", text: "Stability fell by " + _abs(_stabNet) + ", which can make later pressure harder to absorb." })>>
<</if>>
<<if _popsNet < 0>>
<<run _alerts.push({ title: "Population fell", text: "Your tribe ended the turn smaller than it began." })>>
<</if>>
<<if _alerts.length is 0 and _sharpestLoss>>
<<run _alerts.push({ title: "No immediate crisis", text: _sharpestLoss.title + " took the sharpest hit, but no category is screaming for emergency action." })>>
<<elseif _alerts.length is 0>>
<<run _alerts.push({ title: "Steady turn", text: "Nothing swung hard enough to demand urgent action next turn." })>>
<</if>>
<<set _focus = _reportCategories[$reportFocus]>>
<</silently>>
<div class="report-head">
<div class="report-kicker">Season Ledger</div>
<div class="report-title">End of Turn Report</div>
<p class="report-subtitle"><<print _summaryText>></p>
</div>
<div class="report-summary-grid report-metric-ledger">
<<for _i = 0; _i < _overviewRows.length; _i++>>
<<set _row = _overviewRows[_i]>>
<div class="report-summary-card report-summary-card--compact report-metric-card report-card-<<print _row.tone>> <<if _row.net is 0>>is-muted<</if>> <<if $reportFocus is _row.key>>is-active<</if>>">
<div class="report-summary-card-top">
<span class="report-summary-label"><<print _row.label>></span>
<<if _row.net is 0>>
<span class="report-summary-net neutral">Flat</span>
<<else>>
<span class="report-summary-net <<print _row.tone>>"><<print _signed(_row.net)>></span>
<</if>>
</div>
<span class="report-summary-main"><<print _row.total>></span>
<<capture _row>>
<<link _row.label>><<set $reportFocus = _row.key>><<goto "Report">><</link>>
<</capture>>
</div>
<</for>>
</div>
<div class="report-main-grid">
<section class="report-spotlight-card report-main-panel report-largest-card">
<div class="report-section-kicker">What Changed</div>
<h2 class="report-panel-title">Largest Changes</h2>
<div class="report-impact-list">
<<if _topChanges.length>>
<<for _i = 0; _i < _topChanges.length && _i < 3; _i++>>
<<set _row = _topChanges[_i]>>
<<set _causeLines = _row.lines.filter((line) => Number(line.value ?? 0) !== 0).sort((a, b) => _abs(b.value) - _abs(a.value))>>
<div class="report-impact-row report-change-group">
<div class="report-impact-copy report-change-head">
<strong><<print _row.label>></strong>
<span class="report-summary-net <<print _row.tone>>"><<print _signed(_row.net)>></span>
</div>
<<if _causeLines.length>>
<div class="report-cause-list">
<<for _j = 0; _j < _causeLines.length && _j < 3; _j++>>
<<set _line = _causeLines[_j]>>
<div class="report-cause-row">
<span><<print _line.label>></span>
<b class="<<print _line.tone>>"><<print _signed(_line.value)>></b>
</div>
<</for>>
</div>
<</if>>
</div>
<</for>>
<<else>>
<div class="report-impact-row report-impact-row--quiet">
<div class="report-impact-copy">
<strong>No category dominated the turn</strong>
<small>Most values held close to where they began.</small>
</div>
<span class="report-summary-net neutral">Flat</span>
</div>
<</if>>
</div>
</section>
<div class="report-breakdown-shell report-main-panel">
<div class="report-breakdown-head">
<div>
<div class="report-section-kicker">Why It Changed</div>
<h2 class="report-panel-title"><<print _focus.label>></h2>
</div>
<div class="report-breakdown-trail">
<<if _focus.net is 0>>
<span class="report-summary-net neutral">Flat</span>
<<else>>
<span class="report-summary-net <<print _focus.tone>>"><<print _signed(_focus.net)>></span>
<</if>>
</div>
</div>
<div class="report-breakdown-lines <<if _focus.lines.length >= 3>>report-breakdown-lines--dense<</if>>">
<<for _i = 0; _i < _focus.lines.length; _i++>>
<<set _line = _focus.lines[_i]>>
<div class="report-breakdown-line">
<div class="report-breakdown-copy">
<span class="report-breakdown-kind"><<print _line.kind>></span>
<strong><<print _line.label>></strong>
<small><<print _line.text>></small>
</div>
<span class="report-breakdown-value <<print _line.tone>>"><<print _signed(_line.value)>></span>
</div>
<</for>>
</div>
</div>
<aside class="report-attention-card">
<div class="report-section-kicker">Next Turn</div>
<h2 class="report-panel-title">Needs attention</h2>
<div class="report-attention-list">
<<for _i = 0; _i < _alerts.length && _i < 2; _i++>>
<<set _alert = _alerts[_i]>>
<div class="report-attention-item">
<strong><<print _alert.title>></strong>
<small><<print _alert.text>></small>
</div>
<</for>>
</div>
</aside>
</div>
</div><h2>Restart?</h2>
<p>This will restart the story from the beginning.</p>
<<link "Yes, restart">><<run Engine.restart()>><</link>>
<<return "Go Back">><<nobr>>
<<run setup.rituals && setup.rituals.ensureState ? setup.rituals.ensureState() : null>>
<<ritualPanel>>
<</nobr>><<nobr>>
<<ritualResultPanel>>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing</span>
<h2 class="ritual-title">Bless Bonds</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>You call the camp together and speak over the value of chosen bonds: two fires joined, two duties shared, two lives made steadier by being bound before the tribe.</p>
<p>Some listen with reverence. Some with curiosity. In the end, a young man and woman from among the camp step forward, asking for your permission to be together.</p>
<p>You give it.</p>
<p>By the time the rite ends, the shape of such bonds feels a little firmer in the camp's mind.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Offering</span>
<h2 class="ritual-title">Blood Offering</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The tribe gathers in silence. The victim- Nay, The sacrifice, is brought before you. They struggle at first, but its useless, as your hunters hold them steady.</p>
<p>You slowly take an obsidian knife, aproach them. Say the sacred words for all the tribe to hear...As the knife meets the sacrifices throat. A red fountain erupts. No sound comes from the mouth, as the body is allowed to fall on the primitve stone altar, the shade of it quickly turning crimson.</p>
<p>A complete silence follows. Some of it fear, some of it genuine reverence. With most its a mix of both</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing</span>
<h2 class="ritual-title">Call Back the Herds</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The tribe leaves offerings of bone, fat, and seed. For a time the hunting paths grow quiet.</p>
<p>Then tracks return where none had been, and the land stirs with cautious life.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing</span>
<h2 class="ritual-title">Cull of the Weak</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>What stands before you is a line of hunters: the young, the old, the broad-shouldered, the lean.
All of them silent.
All of them waiting. Yet silence means little to you.</p>
<p>
Their heartbeats speak plainly enough. You walk past them once, observing their bodies, their reactions, their fear.
You see the one with the old wound, the one who favors one leg when he thinks no one is looking. You see the one whose breathing turns shallow as you draw near. You see weakness hidden beneath muscle, beneath pride, beneath the painted marks of hunters who still wish to be counted among the strong.
When your inspection is finished, you finally stop before one of them. You raise your hand.</p>
<p><strong>CRACK.</strong></p>
<p>His body drops to the ground. Another hunter flinches.</p>
<p><strong>CRACK.</strong></p>
<p>He falls as well. For a moment, you consider continuing. There are always more flaws to find. More fear to carve away. But then you look at those who remain. No. It is enough. The weak links have been purged. The survivors will fight with greater vigor now, if only to avoid sharing the same fate. Fear will sharpen them. At least for a while. Until fear, too, begins to fade from memory.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing</span>
<h2 class="ritual-title">Feast of the Hearth</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>Food is given first to you, then to the spirits, before , then it's shared among the living. The fires burn low, but the people sit closer together. In warmth, they remember you.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Divination</span>
<h2 class="ritual-title">Foretell Weather</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>Ash lifts from the fire and turns before the wind should touch it. The tribe falls quiet as the pattern becomes clear to you. The next season shows one of its faces.</p>
<<ritualForecastText>>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing · Tier 1</span>
<h2 class="ritual-title">Unbound Revelry</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>You build the fire larger than any cooking pit and call the camp around it. You speak over the right to take pleasure where it is offered, to give it without price, to set down names and claims for one night and let the body have what it wants.</p>
<p>Some listen with their hands already on each other. A woman pulls loose the ties at a hunter's waist and takes his cock in her fist, stroking him hard while he cups her tits through her shirt. Near the fire's edge a woman lies back on a spread hide while another kneels between her thighs, tongue working in slow wet circles, her fingers spreading the other open. Someone laughs, low and warm, and the sound breaks something open in the crowd.</p>
<p>Clothing falls. Skin catches the glow of the fire. The camp dissolves into tangled limbs and moving bodies. A young woman arches between two men near the woodpile, one buried deep between her legs while the other fucks her mouth, her nails raking the bare ground, her muffled cries sharp against the dark. Another straddles her partner by the fire's edge, riding him in slow deep strokes, her pussy swallowing his cock to the root with each drop of her hips, her wetness running down his balls. A second woman kneels behind her, fingers working between her own thighs, watching.</p>
<<if $ritualResult and $ritualResult.id is "freeLove" and $ritualResult.mediaSrc>>
<<nsfwimg $ritualResult.mediaSrc "Unbound Revelry">>
<</if>>
<p>Men finish inside women without pulling out. That is the point of the night. Seed spills into willing cunts, overflows, leaks down trembling thighs. A woman on all fours takes a man from behind, her tits swaying with each thrust, groaning through her teeth as he drives deep and holds, pumping her full. Another pushes two fingers into herself alongside the cum already pooling there, working it deeper with a shudder.</p>
<p>The smell of sex hangs thick over the camp, mixing with woodsmoke and sweat. Wet sounds, slapping skin, bitten-off groans and open moans carry through the dark.</p>
<p>By dawn the fire has burned to embers. Bodies lie tangled together in furs and on bare ground, cunts leaking, skin flushed, limbs heavy with sleep. Something has loosened in the camp that was tight before.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Offering</span>
<h2 class="ritual-title">Simple Offering</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The offering is placed down and the ritual begins with you leading it. Its a simple affair. An animal is sacrificed, some goods left for good fortunes. At the end of it, belief in you is left just a bit stronger than before</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Blessing</span>
<h2 class="ritual-title">The Spirit Mask</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The mask is only wood, hide, paint, and shadow. Yet when you wear it, the camp grows quieter.</p>
<p>Prisoners lower their eyes. Followers answer more quickly than before.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Offering</span>
<h2 class="ritual-title">Taboo of the Hunt</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The hunters leave the strongest does and the young bucks untouched. Bones are buried with care.</p>
<p>The people eat less freely, but the herds are no longer treated as mere meat.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker">Offering</span>
<h2 class="ritual-title">Whispered Devotion</h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The prayers begin with the old spirits, but your name finds its way among them.</p>
<p>Some speak it softly. Others repeat it with growing certainty.</p>
</div>
<div class="ritual-result-lines"><<ritualResultLines>></div>
</div>
<div class="ritual-result-actions"><<ritualResultReturn>></div>
</div>
</div>
<</nobr>><<nobr>>
<<set _rid = $ritualPendingId ?? $ritual.sel>>
<<set _def = setup.rituals.getDef(_rid)>>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head">
<span class="ritual-kicker"><<print _def ? setup.rituals.formatCategoryTier(_def) : "Ritual">></span>
<h2 class="ritual-title"><<print _def ? _def.name : "Unknown Ritual">></h2>
</div>
<div class="ritual-result-body">
<div class="ritual-result-text">
<p>The tribe gathers and waits for the rite to take shape.</p>
</div>
</div>
<div class="ritual-result-actions"><<ritualStartActions _rid "Complete Ritual">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "bargainWithSky">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Divination</span><h2 class="ritual-title">Bargain With the Sky</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Offerings are raised toward pressure, cloud, and hunger. This is no mere reading. You reach for the shape of the coming season and demand it to bend!</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "bargainWithSky" "Make the Bargain">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "blessBonds">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">Bless Bonds</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The camp is called together around joined fires. You prepare to speak over chosen bonds and make the idea of Union feel steadier in the tribe's mind.</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "blessBonds" "Bless the Bonds">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "bloodOffering">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Offering</span><h2 class="ritual-title">Blood Offering</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The camp goes still as you name the offering. No one mistakes this for a small prayer. A life is brought forward, and fear gathers around the fire as preperations for the offering begin</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "bloodOffering" "Spill the Offering">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "callBackHerds">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">Call Back the Herds</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Bone, fat, and seed are carried to places where old tracks have faded. The people do not truly understand why you are making them do this, but they soon will, as preperations begin</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "callBackHerds" "Call the Herds">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "cullOfTheWeak">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">Cull of the Weak</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The tribe is ordered to bring all of the Hunters and Warriors before you for an...inspection</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "cullOfTheWeak" "Complete the Cull">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "feastOfHearth">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">Feast of the Hearth</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The food stores are opened, as you call all belonging to your tribe to celebrate! The gift of life!
The gift of bounty!
While what tommorow brings might be uncertain, what you do know is that nobody will be left hungry tonight</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "feastOfHearth" "Begin the Feast">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "foretellWeather">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Divination</span><h2 class="ritual-title">Foretell Weather</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Smoke, wind, animal unease, and the pressure in the air are read by you. Smell, Taste, and forces that are difficult to put into words give you the answers you seek</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "foretellWeather" "Read the Signs">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "freeLove">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing · Tier 1</span><h2 class="ritual-title">Unbound Revelry</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The camp is called together after dark around a single great fire. You prepare to speak over the freedom of the body, the fire that moves through blood and asks no names.</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "freeLove" "Begin the Revelry">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "simpleOffering">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Offering</span><h2 class="ritual-title">Simple Offering</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Food and small goods are laid before you and the makeshift alter, as the preperations for the offering get underway</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "simpleOffering" "Make the Offering">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "spiritMask">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">The Spirit Mask</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Wood, hide, paint, and shadow are arranged into a face of strange propritons. As you are putting on the finishing touches, the face begins to make those who look at it feel relaxed in its presence, even before the Ritual is finished</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "spiritMask" "Wear the Mask">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "tabooOfTheHunt">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Offering</span><h2 class="ritual-title">Taboo of the Hunt</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>Hunters gather with bone, hide, and ash. You call them to you as you prepare to give your decree as leader</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "tabooOfTheHunt" "Declare the Taboo">></div>
</div>
</div>
<</nobr>><<nobr>>
<<set $ritualPendingId = "whisperedDevotion">>
<div class="ritual-result-root">
<div class="ritual-result-card">
<div class="ritual-result-head"><span class="ritual-kicker">Blessing</span><h2 class="ritual-title">Whispered Devotion</h2></div>
<div class="ritual-result-body"><div class="ritual-result-text">
<p>The tribe lowers its voice until prayer becomes breath. Old spirst are spoken of first, but there is room in the hush for a new name to be learned.</p>
</div></div>
<div class="ritual-result-actions"><<ritualStartActions "whisperedDevotion" "Begin the Prayer">></div>
</div>
</div>
<</nobr>><div class="intro-creation intro-start-form intro-void-awakening no-click-sfx intro-void-story">
<<run setup.playIntro()>>
<p>You exist in nothingness. A void without form or substance, yet here you are. Conscious.</p>
<p>You try to form a thought, but it slips your mind, if you can call what you have a mind.</p>
<p>You try to speak, but nothing comes out of your mouth, if you can call what you have a mouth.</p>
<p>The very concept of existing is difficult as your essence slips from reality and back here, if this can even be called a place at all.</p>
<p>Minutes pass. Hours. Years. Eons.</p>
<p>Then finally, the first thought in so long, if ever, forms. A question. And with it, a desire to know the answer.</p>
<<button "Who are you?">>
<<goto "Vessel_Creation">>
<</button>>
</div><<seasonPlanUI>>\::Sexual_Intercourse
<<silently>>
/* Resolve active person */
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
/* Find person */
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Gender + relationship numbers */
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if _isFemale>>
<<set _aff = Number(_p ? (_p.love ?? _p.trust ?? 0) : 0)>>
<<else>>
<<set _aff = Number(_p ? (_p.trust ?? 0) : 0)>>
<</if>>
<<set _obed = Number(_p ? (_p.obedience ?? 0) : 0)>>
<<set _rel = Math.max(_aff, _obed)>>
/* Session state: DO NOT reset on every rerender, and DO NOT reset on ended */
<<if !$sexSession or $sexSession.pid != _pid>>
<<set $sexSession = {
pid: _pid,
a1: 0,
a2: 0,
bliss1: 0,
bliss2: 0,
tier1Uses: 0,
t2Fails: 0,
t3Fails: 0,
t4Fails: 0,
t2Unlocked: false,
t3Unlocked: false,
t4Unlocked: false,
output: "",
ended: false
}>>
<</if>>
<<set _S = $sexSession>>
/* ----------------------------
RESOLUTION PHASE (RUN FIRST)
So output is visible THIS render
---------------------------- */
/* If ended already, do nothing */
<<if !_S.ended>>
/* Fail caps -> end */
<<if (_S.t2Fails >= 3 or _S.t3Fails >= 3 or _S.t4Fails >= 3)>>
<<set _S.ended = true>>
<<set _S.output = "The moment collapses under repeated missteps.">>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 2>>
<</if>>
<</if>>
/* Handle Arousal peaks. Priority: Arousal_1 peak (endurance) FIRST. */
<<set _didPeak1 = false>>
<<if !_S.ended and _S.a1 >= 20>>
<<set _dc = 12 + _S.bliss1>>
<<set _stat = setup.player.getStatForCheck("endurance")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<if _total >= _dc>>
<<set _S.a1 = 0>>
<<set _S.bliss1 += 1>>
<<set _S.output =
"<div class='npc-check npc-check-ok'>Endurance check: (Endurance " + _stat + " + d20 " + _roll + ") = " + _total +
" vs DC " + _dc + ". <b>Success!</b></div>" +
"<div class='npc-answer' style='margin-top:.5rem;'>You recover and can continue.</div>">>
<<else>>
<<set _S.ended = true>>
<<set _S.output =
"<div class='npc-check npc-check-bad'>Endurance check: (Endurance " + _stat + " + d20 " + _roll + ") = " + _total +
" vs DC " + _dc + ". <b>Fail!</b></div>" +
"<div class='npc-answer' style='margin-top:.5rem;'>You can’t maintain control. It ends.</div>">>
<</if>>
<<set _didPeak1 = true>>
<</if>>
/* Arousal_2 peak -> love reward + bliss2 (ONLY if we didn't just do peak1 this render) */
<<if !_S.ended and !_didPeak1 and _S.a2 >= 20>>
<<set _S.a2 = 0>>
<<set _S.bliss2 += 1>>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) + 2>>
<</if>>
<<set _S.output = "Her response softens noticeably.">>
<</if>>
<</if>>
<</silently>>
<div class="hub-textbox">
<div>
<b>Arousal_Bar_1:</b> <<print _S.a1>> / 20<br>
<b>Arousal_Bar_2:</b> <<print _S.a2>> / 20<br>
<b>Bliss_1:</b> <<print _S.bliss1>><br>
<b>Bliss_2:</b> <<print _S.bliss2>>
</div>
<<if _S.output>>
<hr>
<<print _S.output>>
<</if>>
<<if _S.ended>>
<hr>
<<if _S.bliss2 >= 3>>
The interaction ends with a lingering warmth and an unspoken closeness.
<<elseif _S.bliss2 >= 1>>
The interaction ends on a quieter note—acceptance, if not tenderness.
<<else>>
The interaction ends without much softness.
<</if>>
<</if>>
</div>
<div class="hub-buttons">
<<if !_S.ended>>
<!-- TIER 1 -->
<<if _S.tier1Uses < 3>>
<<button "Simple action">>
<<silently>>
<<set _S.tier1Uses += 1>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "She shifts slightly, waiting for you to commit to something more deliberate.">>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<<else>>
<span class="macro-button disabled">“Get on with it already.”</span>
<</if>>
<!-- Tier 2 -->
<<button "Escalate">>
<<silently>>
<<if _S.t2Unlocked>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "She accepts the shift in pace without resistance.">>
<<elseif _rel >= 80>>
<<set _S.t2Unlocked = true>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She doesn’t hesitate.</div>">>
<<else>>
<<set _baseDC = 14>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = setup.player.getStatForCheck("charisma")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t2Unlocked = true>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She agrees, cautiously.</div>">>
<<else>>
<<set _S.t2Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She refuses, expression unreadable.</div>">>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 1>>
<</if>>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- Tier 3 -->
<<button "Press further">>
<<silently>>
<<if _S.t3Unlocked>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "Her response sharpens.">>
<<elseif _rel >= 80>>
<<set _S.t3Unlocked = true>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She gives a quick nod.</div>">>
<<else>>
<<set _baseDC = 17>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = setup.player.getStatForCheck("charisma")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t3Unlocked = true>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She allows it—this time.</div>">>
<<else>>
<<set _S.t3Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She stops you, clearly unimpressed.</div>">>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- Tier 4 -->
<<button "Push the limit">>
<<silently>>
<<if _S.t4Unlocked>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "She meets the intensity without backing away.">>
<<elseif _rel >= 80>>
<<set _S.t4Unlocked = true>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She accepts without protest.</div>">>
<<else>>
<<set _baseDC = 20>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = setup.player.getStatForCheck("charisma")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t4Unlocked = true>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She relents.</div>">>
<<else>>
<<set _S.t4Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She pulls back completely.</div>">>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- End interaction (player convenience) -->
<<button "End interaction">>
<<silently>>
<<set _S.ended = true>>
<<set _S.output = "You decide to stop before pushing things further.">>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<<else>>
<!-- WHEN ENDED: ONLY THIS BUTTON REMAINS -->
<<button "End intercourse">>
<<set $sexSession = null>>
<<goto "Person_Info">>
<</button>>
<</if>>
</div>\:: StoryInit
/* ======================================================
CORE STATS
====================================================== */
<<set $wisdom = 0>>
<<set $height = 70>>
<<set $strength = 0>>
<<set $endurance = 0>>
<<set $leadership = 0>>
<<set $charisma = 0>>
<<set $stewardship = 0>>
<<set $belief = 6>>
/* ======================================================
POPULATION & ECONOMY
====================================================== */
<<set $pops = 1>>
<<set $settlements = 0>>
<<set $resources = 20>>
<<set $food = 91>>
<<set $goods = 2>>
<<set $playerMilStr = 0>>
<<set $defended = 0>>
<<set $campFortifiedReady = 0>>
<<set $raidCombatTutorialSeen = false>>
<<set $raidCombatTutorialMode = "attack">>
<<set $age1WorldGenDifficulty = "godling">>
/* ======================================================
STABILITY & FAITH
====================================================== */
<<set $stability = 0>>
<<set $zeal = 0>>
/* ======================================================
TURN / ENERGY SYSTEM
====================================================== */
<<set $energyMax = 2>>
<<set $energy = $energyMax>>
<<set $turn = 0>>
<<set $seasonPlanFlags = {}>>
/* ======================================================
TRIBE IDENTITY
====================================================== */
<<set $tribeName = "—">>
<<set $government = "Nomadic Group">>
/* ======================================================
UI UNLOCKS
====================================================== */
<<set $uiUnlocks = $uiUnlocks ?? {
character: false,
inventory: true,
relationships: false,
quests: false,
faith: false,
diplomacy: false,
laws: true,
map: false
} >>
<<set $debug = false>>
<<set $helpReturnPassage = $helpReturnPassage ?? "">>
<<set $musicState = $musicState ?? { playing:false, track:"", source:"" }>>
<<set $mainThemeStarted = $mainThemeStarted ?? false>>
<<set $heartbeatActive = $heartbeatActive ?? false>>
/* ======================================================
MAP & PLAYER CAMP
====================================================== */
<<set $mapSize = 7>>
<<set $campX = null>>
<<set $campY = null>>
/* ======================================================
NPC CAMPS
====================================================== */
/* Camp 1 (preset) */
<<set $npcCampX = null>>
<<set $npcCampY = null>>
<<set $npcTemperament = "aggressive">>
<<set $npcTurnsSinceMove = 0>>
/* Camp 2 (preset) */
<<set $npcCamp2X = null>>
<<set $npcCamp2Y = null>>
<<set $npc2Temperament = "trader">>
<<set $npc2TurnsSinceMove = 0>>
/* Camp 3 (random on first spawn; JS rolls and stores it) */
<<set $npcCamp3X = null>>
<<set $npcCamp3Y = null>>
<<set $npc3Temperament = "random">>
<<set $npc3TurnsSinceMove = 0>>
/* Camp 4 (tutorial tribe, random on first spawn) */
<<set $npcCamp4X = null>>
<<set $npcCamp4Y = null>>
<<set $npc4Temperament = "random">>
<<set $npc4TurnsSinceMove = 0>>
/* Camp 5 (tier 4 advanced shaping, random on first spawn) */
<<set $npcCamp5X = null>>
<<set $npcCamp5Y = null>>
<<set $npc5Temperament = "random">>
<<set $npc5TurnsSinceMove = 0>>
/* ======================================================
TRIBES (canonical)
====================================================== */
<<set $tribes = $tribes ?? []>>
<<set $otherTribeData = $otherTribeData ?? {}>>
<<set $metTribeIds = $metTribeIds ?? {}>>
<<set $metTribes = $metTribes ?? []>>
<<set $revealedNpcCamps = $revealedNpcCamps ?? {}>>
<<set $scoutedNpcUntil = $scoutedNpcUntil ?? {}>>
<<set $defeatedTribes = $defeatedTribes ?? {}>>
/* ======================================================
EVENT SYSTEM
====================================================== */
<<set $currentEvent = null>>
<<set $eventQueue = []>>
<<set $eventCooldowns = {}>>
<<set $firedEvents = {}>>
/* ======================================================
POWERS & STAT TRACKING
====================================================== */
<<set $powersOwned = {}>>
<<set $statsPending = {}>>
<<set $characterPanelTab = "character">>
<<set $selectedTraits = []>>
<<set $currentFlaws = []>>
<<set $vesselStability = "marked">>
<<set $traitLimitMax = 2>>
<<set $maxFlaws = 2>>
<<set $flawPressure = {}>>
<<set $flawQueue = []>>
<<set $raidFever = { turnsSinceOffensive: 0, restless: false, lastTickTurn: 0 }>>
<<set $aspects = { known: ["blood", "hearth", "elements", "influence"], points: { blood: 0, hearth: 0, elements: 0, influence: 0 }, primary: null, secondary: [], recent: [] }>>
<<set $rituals = { known: ["simpleOffering", "bloodOffering", "feastOfHearth", "foretellWeather"], cooldowns: {}, completed: {}, tempBonuses: {}, weatherForecast: null }>>
<<set $ritual = { filter: "all", sel: "simpleOffering" }>>
<<set $ritualResult = null>>
/* ======================================================
ARTIFACTS / INVENTORY (SAVE-SAFE STATE)
====================================================== */
<<set $relics = $relics ?? { owned: [], active: {}, cooldowns: {} }>>
/* ======================================================
INVENTORY (ITEMS + EQUIPMENT) (SAVE-SAFE STATE)
====================================================== */
<<set $inv = $inv ?? {
items: {},
order: [],
equipped: { Head: null, Body: null, ArmLeft: null, ArmRight: null, Legs: null },
uidCounter: 0,
log: []
} >>
<<set $invTab = $invTab ?? "items">>
<<set $invSel = $invSel ?? null>>
/* ======================================================
CRAFTING (SAVE-SAFE STATE)
====================================================== */
<<set $craft = $craft ?? { sel: "" }>>
/* ======================================================
NPC SYSTEM
====================================================== */
<<set $campNpcs = $campNpcs ?? []>> /* array of NPC entries */
<<set $generatedNpcCounter = $generatedNpcCounter ?? 0>>
<<set $npcTalks = $npcTalks ?? {}>> /* { npcId: number } */
<<set $npcTestAdded = $npcTestAdded ?? false>>
/* ======================================================
QUEST SYSTEM
====================================================== */
<<set $quests = $quests ?? []>>
<<set $questFlags = $questFlags ?? {}>> /* prevents duplicate quests */
/*
Quest object shape:
{
id,
name,
desc,
objective,
status, // "active" | "complete" | "failed"
targetX,
targetY,
markerRevealed,
expeditionPassage
}
*/
<<set $victoryCampIds = $victoryCampIds ?? null>>
<<set $enemyTribesInitial = $enemyTribesInitial ?? null>>
<<set $enemyTribesRemaining = $enemyTribesRemaining ?? null>>
<<set $victoryEndShown = $victoryEndShown ?? false>>
<<set $regionUnification = $regionUnification ?? null>>
/* ======================================================
AUDIO
====================================================== */
<<cacheaudio "intro" "sounds/TheVoid.mp3">>
<<cacheaudio "static" "sounds/static.mp3">>
<<cacheaudio "horsewalk" "sounds/HorseWalk.mp3">>
<<cacheaudio "age1" "sounds/TheFirstAge.mp3">>
<<cacheaudio "age1_mishan" "sounds/The Last Stand.mp3">>
<<cacheaudio "Battle" "sounds/TheHunt.mp3">>
<<cacheaudio "heartbeat" "sounds/heartbeat.mp3">>
<<cacheaudio "amputation" "sounds/amputation.mp3">>
<<cacheaudio "stars" "sounds/stars.mp3">>
<<cacheaudio "LostTime" "sounds/LostTime.mp3">>
<<cacheaudio "HiddenMemories" "sounds/hidden_memories.mp3">>
<<cacheaudio "Caves" "sounds/Caves.mp3">>
<<cacheaudio "UP_Ruins" "sounds/ruins_background.mp3">>
<<cacheaudio "UP_Voices" "sounds/voices.mp3">>
<<cacheaudio "drip" "sounds/drip.mp3">>
<<cacheaudio "splash" "sounds/splash.mp3">>
/* ======================================================
PASSAGE DISPLAY HOOK (bind once)
====================================================== */
<<script>>
if (!setup._uiBindingsInstalled) {
setup._uiBindingsInstalled = true;
setup.syncStoryScrollShell = function () {
try {
const body = document.body;
if (!body) return;
const tags = String(body.getAttribute("data-tags") || "").toLowerCase();
const hasStoryScrollTag = /(^|\s)storyscroll(\s|$)/.test(tags);
const hasTribalScrollTags = /(^|\s)hideuiscroll(\s|$)/.test(tags) && /(^|\s)tribal(\s|$)/.test(tags);
const passage = document.querySelector("#passages > .passage:last-child");
const hasStoryShell = !!(passage && passage.querySelector(".hub-textbox, .intro-grounded"));
body.classList.toggle("story-scroll-shell", hasStoryShell && (hasStoryScrollTag || hasTribalScrollTags));
} catch (e) {}
};
$(document).off(":passagedisplay.uiBindings").on(":passagedisplay.uiBindings", function (ev) {
try {
// always update current passage title for chatter visibility
State.temporary._passTitle = (ev && ev.passage) ? ev.passage.title : "";
if (setup && typeof setup.syncStoryScrollShell === "function") {
setup.syncStoryScrollShell();
}
if (setup && typeof setup.clearNostalgiaSleepVeil === "function") {
setup.clearNostalgiaSleepVeil();
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Echoes") {
if (setup && typeof setup.fadeCurrentMusicOut === "function") {
setup.fadeCurrentMusicOut({ durationMs: 15000, stopAtEnd: true });
}
if (setup && typeof setup.startNostalgiaSleepVeil === "function") {
setup.startNostalgiaSleepVeil({
useScrollBottom: true,
blink: true
});
}
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Echoes_2") {
if (setup && typeof setup.revealEchoesBlackout === "function") {
setup.revealEchoesBlackout({ fadeInMs: 4200 });
}
if (setup) {
if (setup._echoesLostTimeTimer) {
window.clearTimeout(setup._echoesLostTimeTimer);
}
setup._echoesLostTimeTimer = window.setTimeout(function () {
setup._echoesLostTimeTimer = null;
try {
if (!State || !State.passage || State.passage !== "Event_Major_Echoes_2") return;
if (typeof setup.playNamedTrackFadeIn !== "function") return;
const baseVolume = (setup.audio && typeof setup.audio.getMusicVolume01 === "function")
? setup.audio.getMusicVolume01()
: ((settings.masterVolume ?? 10) / 10);
setup.playNamedTrackFadeIn("LostTime", {
durationMs: 6500,
startRatio: 0.03,
targetVolume: Math.max(0, Math.min(1, baseVolume * 0.16)),
easePow: 1.2,
source: "scene",
stopAll: false
});
} catch (e) {}
}, 3200);
}
if (setup && typeof setup.startNostalgiaSleepVeil === "function") {
setup.startNostalgiaSleepVeil({
useScrollBottom: true,
blink: true
});
}
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Nostalgia_5") {
if (setup && typeof setup.fadeNamedTrackVolume === "function") {
setup.fadeNamedTrackVolume("horsewalk", {
useSfxVolume: true,
fromVolume: ((setup.audio && setup.audio.getSfxVolume01) ? setup.audio.getSfxVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.42,
targetVolume: ((setup.audio && setup.audio.getSfxVolume01) ? setup.audio.getSfxVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.07,
durationMs: 7000,
easePow: 1.2
});
}
if (setup && typeof setup.playNamedTrackFadeIn === "function") {
setup.playNamedTrackFadeIn("LostTime", {
durationMs: 8000,
startRatio: 0.08,
easePow: 1.18,
source: "scene",
stopAll: false
});
}
if (setup && typeof setup.startNostalgiaSleepVeil === "function") {
setup.startNostalgiaSleepVeil({
triggerSelector: ".nostalgia-sleep-trigger",
endSelector: ".nostalgia-sleep-target",
blink: true
});
}
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Nostalgia_6") {
if (setup && typeof setup.stopSimpleAudioTrack === "function") {
setup.stopSimpleAudioTrack("horsewalk");
}
}
// refresh sidebar buttons every passage
new Wikifier(null, "<<refreshSidebarUnlocks>>");
} catch (e) {}
});
}
<</script>><div id="ui-root">
<!-- LAYERS -->
<div id="ui-border-layer"></div>
<div id="ui-bg-layer"></div>
<div id="ui-frame">
<div id="ui-grid">
<!-- MAIN CONTENT (top-left) -->
<div id="content-wrapper" class="ui-panel">
<div id="passages"></div>
<div id="floating-action"></div>
</div>
<!-- STATS / STATUS (top-right) -->
<aside id="sidebar" class="ui-panel">
<div class="sidebar-panel active" data-panel="status">
<div id="sidebar-inner">
<div class="sidebar-header">
<h2>Status</h2>
</div>
<div class="sidebar-core">
<div class="identity">
<a class="icon-slot patreon-badge" href="https://www.patreon.com/cw/KaspeliProductions" target="_blank" rel="noopener">
<span class="icon-glyph">❤</span>
</a>
<div class="identity-text">
<div>Name: <span id="ui-name"></span></div>
<div>Time: —</div>
</div>
</div>
</div>
<div class="sidebar-resource">
<span>Belief:</span>
<span class="resource-value" id="ui-belief">—</span>
</div>
<div class="sidebar-stats">
<div>Wisdom: <span id="stat-wisdom"></span></div>
<div>Strength: <span id="stat-strength"></span></div>
<div>Endurance: <span id="stat-endurance"></span></div>
<div>Leadership: <span id="stat-leadership"></span></div>
<div>Charisma: <span id="stat-charisma"></span></div>
<div>Stewardship: <span id="stat-stewardship"></span></div>
</div>
<section class="sidebar-turn-module" aria-label="Action Points and turn controls">
<div class="sidebar-energy">
<div class="sidebar-energy-label">Action Points</div>
<div class="sidebar-energy-icons" id="ui-energy"></div>
</div>
<section class="sidebar-flow is-hidden" id="primary-flow" aria-live="polite">
<div class="sidebar-flow-kicker">Turn</div>
<div class="sidebar-flow-copy">Ready to conclude the season.</div>
<div class="sidebar-flow-action"></div>
<div class="sidebar-flow-note" hidden></div>
</section>
</section>
<div class="sidebar-image"></div>
</div>
</div>
</aside>
<!-- CIVILIZATION (bottom-left) -->
<aside id="civsidebar" class="ui-panel">
<div class="sidebar-panel active" data-panel="civ">
<div class="sidebar-header">
</div>
<!-- Split layout -->
<div class="civ-split">
<!-- LEFT: Civ dashboard -->
<div class="civ-left">
<div class="civ-sidecluster civ-sidecluster--camp">
<div class="civ-sidecluster-head">
<span class="civ-sidecluster-kicker">Camp</span>
</div>
<div class="civ-left-inner">
<!-- ONE ROW: 5 uniform tiles + identity pushed right -->
<div class="civ-headrow">
<!-- Compact identity (right aligned) -->
<div class="civ-identity-compact has-tip" data-tip="Your tribe's name, style of rule, and current historical age. These shape available actions and how other tribes regard you.">
<div class="icon-slot">🏕</div>
<div class="identity-text">
<div><span id="civ-name">—</span></div>
<div><span id="civ-gov">—</span></div>
<div class="civ-age-row">Age: <span id="ui-age"></span></div>
</div>
</div>
<!-- 5 uniform stat/resource tiles -->
<div class="civ-statrow">
<div class="civ-res-card has-tip" data-res="pops" data-tip="Population — the people in your camp. Grows through births, shrinks when food runs out. Drives hunting, gathering, and food upkeep each turn.">
<div class="civ-res-hdr">
<span class="civ-res-name">Population</span>
<span class="civ-res-val" id="civ-pops">—</span>
</div>
<div class="civ-res-sub"></div>
</div>
<div class="civ-res-card has-tip" data-res="mil" data-tip="Military — armed and trained members of the tribe. Defends the camp against raids and enables raiding others. Higher numbers scare off bandits.">
<div class="civ-res-hdr">
<span class="civ-res-name">Military</span>
<span class="civ-res-val" id="civ-mil">—</span>
</div>
<div class="civ-res-sub"></div>
</div>
<div class="civ-res-card has-tip" data-res="food" data-tip="Food stores. Consumed each turn by your population and camp followers. Pop upkeep is seasonal; follower upkeep is flat this pass. If Food hits zero the tribe goes hungry and people begin to die.">
<div class="civ-res-hdr">
<span class="civ-res-name">Food</span>
<span class="civ-res-val" id="civ-food"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-food-delta"></span>
<span class="civ-forecast" id="civ-food-forecast"></span>
</div>
</div>
<div class="civ-res-card has-tip" data-res="resources" data-tip="Raw resources — wood, stone, hides. Spent on crafting, building, camp positions, and most tribe actions.">
<div class="civ-res-hdr">
<span class="civ-res-name">Resources</span>
<span class="civ-res-val" id="civ-resources"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-res-delta"></span>
</div>
</div>
<div class="civ-res-card has-tip" data-res="goods" data-tip="Crafted goods — finished items ready to trade, gift, or equip. Produced from raw resources through crafting actions.">
<div class="civ-res-hdr">
<span class="civ-res-name">Goods</span>
<span class="civ-res-val" id="civ-goods"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-goods-delta"></span>
</div>
</div>
</div>
</div>
<!-- Conditions (ex-Effects): active buffs/debuffs on the tribe -->
<div class="sidebar-segment sidebar-effects">
<div class="sidebar-segment-title"><span>Conditions</span><span class="sidebar-effects-empty" id="civ-effects-empty">No active conditions</span></div>
<div class="sidebar-effects-list" id="civ-effects">
<span id="civ-eff-fortified" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Fortified — your camp defenses are reinforced. Raids are less likely to land, and any damage from them is reduced." style="display:none;"><span class="eff-label">Fortified</span></span>
<span id="civ-eff-breeding" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Incentivized Growth — families are encouraged. Population growth is temporarily increased." style="display:none;"><span class="eff-label">Incentivized Growth</span></span>
<span id="civ-eff-scouted" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Scouted Surroundings — nearby tiles are known. Improves event foresight and reduces ambush risk." style="display:none;"><span class="eff-label">Scouted Surroundings</span></span>
<span id="civ-eff-training" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Trained Hunters — sharper skill in the field. Military strength is increased while this lasts." style="display:none;"><span class="eff-label">Trained Hunters</span></span>
<span id="civ-eff-organized" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Organized Tribe — everyone knows their role. Slightly improves actions and reduces stability loss from bad news." style="display:none;"><span class="eff-label">Organized Tribe</span></span>
<span id="civ-eff-nourished" class="civ-effect-badge has-tip" data-tone="positive" data-tip="Nourished — bellies are full. Population is healthier and grows faster while the effect lasts." style="display:none;"><span class="eff-label">Nourished</span></span>
<span id="civ-eff-shortmats" class="civ-effect-badge has-tip" data-tone="negative" data-tip="Short on materials — crafting and building cost more resources, and some actions may be blocked until you restock." style="display:none;"><span class="eff-label">Short on materials</span></span>
<span id="civ-eff-spoilprov" class="civ-effect-badge has-tip" data-tone="negative" data-tip="Spoiled Provisions — some food has gone bad. Food drains a little each turn until the effect ends." style="display:none;"><span class="eff-label">Spoiled Provisions</span></span>
</div>
</div>
<!-- Scales -->
<div class="civ-scales">
<div id="civ-stability-label" class="civ-scale-label has-tip" data-tip="Stability - order, trust, and calm in the camp. Affects population growth and how obedient new Followers are. Severe instability erodes Camp Follower Obedience each turn.">
<span>Stability</span>
<span class="civ-scale-meta">
<span id="stability-value" class="civ-scale-value" data-tone="neutral">0</span>
<span id="stability-state" class="civ-scale-state" data-tone="neutral">Steady</span>
</span>
</div>
<div class="scale-bar"><div id="stability-fill" class="scale-fill"></div></div>
<div id="civ-zeal-label" class="civ-scale-label has-tip" data-tip="Zeal — the tribe's fervor and drive. High zeal powers bold actions and belief-driven events; too much tips the tribe into recklessness.">
<span>Zeal</span>
<span class="civ-scale-meta">
<span id="zeal-value" class="civ-scale-value" data-tone="neutral">0</span>
<span id="zeal-state" class="civ-scale-state" data-tone="neutral">Smoldering</span>
</span>
</div>
<div class="scale-bar"><div id="zeal-fill" class="scale-fill"></div></div>
</div>
</div>
</div>
</div>
<!-- RIGHT: modular info cards (always visible) -->
<div class="civ-right">
<div class="civ-sidecluster civ-sidecluster--world">
<div class="civ-sidecluster-head">
<span class="civ-sidecluster-kicker">World</span>
</div>
<div class="civ-info-stack">
<!-- Card: Season (hover header for effect summary) -->
<div class="civ-info-card" data-info="season" id="civ-season-card">
<div class="civ-info-head has-tip" id="civ-season-head" data-tip="Season - shapes how food grows, how game behaves, and how harsh the weather is. Each season lasts 4 turns, and its weather shifts yields up or down.">
<span class="civ-info-ico" id="civ-season-ico">☀</span>
<span class="civ-info-title"><span id="civ-season">—</span></span>
<span class="civ-info-meta"><span id="civ-season-subtype">—</span></span>
</div>
<div class="civ-info-body">
<div class="civ-info-row has-tip" data-tip="How far the current season has advanced. Seasons last 4 turns, and the weather stays with them until the bar completes.">
<span class="civ-info-key">Progress</span>
<span class="civ-info-val"><span id="civ-season-progress">—</span></span>
</div>
<div class="civ-info-note" id="civ-season-note">Seasons change how easy it is to stay fed, how strong hunts are, and how quickly the land recovers.</div>
</div>
</div>
<!-- Card: Terrain (hover header for overview; tooltips per line explain each stat) -->
<div class="civ-info-card" data-info="terrain">
<div class="civ-info-head has-tip" id="civ-terrain-head" data-tip="Terrain sets the broad shape of this camp site. Game mostly decides how well the tribe feeds itself here, while resources decide how strong gather yields are.">
<span class="civ-info-ico">🧭</span>
<span class="civ-info-title">Terrain</span>
</div>
<div class="civ-info-body">
<div class="civ-info-row has-tip" data-tip="The type of land your camp occupies. Shapes what you hunt, what you gather, and how often raiders find you.">
<span class="civ-info-key">Type</span>
<span class="civ-info-val"><span id="civ-terrain">—</span></span>
</div>
<div class="civ-info-row has-tip" data-tip="How much game lives here. More game means richer hunts; over-hunting depletes it over time and it recovers faster in mild seasons.">
<span class="civ-info-key">Game</span>
<span class="civ-info-val"><span id="civ-tile-game">—</span></span>
</div>
<div class="civ-info-row has-tip" data-tip="Raw materials available on this tile. Higher levels yield more wood, stone, and hides per gather action.">
<span class="civ-info-key">Resources</span>
<span class="civ-info-val"><span id="civ-tile-res">—</span></span>
</div>
<div class="civ-info-row has-tip" data-tip="Chance per turn that rival tribes strike your camp. Military, Fortified status, and terrain all shift this.">
<span class="civ-info-key">Raid Chance</span>
<span class="civ-info-val"><span id="civ-raid">—</span></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /civ-split -->
</div>
</aside>
<!-- ACTIONS (bottom-right) -->
<section id="action-panel" class="ui-panel">
<div class="sidebar-actions">
<div class="action-page-nav" role="group" aria-label="Action groups">
<button class="action-page-arrow" id="action-page-prev" type="button" aria-label="Show previous action group" title="Previous action group">←</button>
<div class="action-page-status">
<span class="action-page-title">Core Actions</span>
<span class="action-page-count">1 / 2</span>
</div>
<button class="action-page-arrow" id="action-page-next" type="button" aria-label="Show next action group" title="Next action group">→</button>
</div>
<div class="action-page-deck">
<div class="action-page is-active" data-action-page="0">
<button class="feature-btn" id="btn-quests">Quests</button>
<button class="feature-btn" id="btn-relationships">Relationships</button>
<button class="feature-btn" id="btn-character">Character</button>
<button class="feature-btn" id="btn-inventory">Inventory</button>
</div>
<div class="action-page" data-action-page="1">
<button id="btn-faith" class="feature-btn" disabled>Faith</button>
<button id="btn-diplomacy" class="feature-btn" disabled>Federation</button>
<button id="btn-laws" class="feature-btn" disabled>Traditions</button>
<button id="btn-map" class="feature-btn" disabled>Map</button>
</div>
</div>
</div>
<footer id="bottombar">
<div id="bottom-right">
<button class="icon-button" id="btn-save" title="Save">💾</button>
<button class="icon-button" id="btn-settings" title="Settings">⚙</button>
<button class="icon-button" id="btn-help" title="Help">?</button>
</div>
</footer>
</section>
</div>
</div>
</div><<nobr>>
<<print setup.credits.render()>>
<<script>>
setTimeout(function () {
if (setup.credits && typeof setup.credits.init === "function") {
setup.credits.init();
}
}, 0);
<</script>>
<</nobr>><<nobr>>
<<print setup.systemHelp.render()>>
<<script>>
setTimeout(function () {
if (setup.systemHelp && typeof setup.systemHelp.init === "function") {
setup.systemHelp.init();
}
}, 0);
<</script>>
<</nobr>><<nobr>>
<<print setup.systemSaves.render()>>
<<script>>
setTimeout(function () {
if (setup.systemSaves && typeof setup.systemSaves.init === "function") {
setup.systemSaves.init();
}
}, 0);
<</script>>
<</nobr>><<nobr>>
<<print setup.systemSettings.render()>>
<<script>>
setTimeout(function () {
if (setup.systemSettings && typeof setup.systemSettings.init === "function") {
setup.systemSettings.init();
}
}, 0);
<</script>>
<</nobr>><<npcTalkUnified>><<silently>>
<<set $strength += 1>>
<<set $charisma += 1>>
<<set $wisdom += 1>>
<<set $endurance += 1>>
<</silently>>
''<div class="intro-grounded intro-prologue-shell no-click-sfx">
<<if $introEarlyChoice is "strength">>
To earn your place, you fight. Great elk, boar, wolves at the camp edge - whatever threatens the tribe, you meet it first. Your body moves before fear can take root. The others learn that when danger comes, you are often the first to step forward.
<div class="intro-notification good">Strength rises.</div>
<<elseif $introEarlyChoice is "charisma">>
To earn your place, you speak. Not beautifully at first. Not always gently. But well enough. In time, your voice learns how to make clenched fists loosen and frightened hearts listen. Around the fire, your stories become a different sort of shelter.
<div class="intro-notification good">Charisma rises.</div>
<<elseif $introEarlyChoice is "wisdom">>
To earn your place, you watch. You notice animal trails before veteran hunters do. You smell rain before the clouds break. You even manage to anger Morag, the shaman, by snooping around her shelter, though you still learn which mushrooms are edible and which are not.
<div class="intro-notification good">Wisdom rises.</div>
<<else>>
To earn your place, you endure. When cold bites, you keep moving. When hunger hollows the camp, you still stand. When sickness passes through the hides, it leaves you untouched, caring for those who cannot rise.
<div class="intro-notification good">Endurance rises.</div>
<</if>>
In time, the camp stops treating you as a guest.
A place by the fire is always left open for you. Hunters wait for you before leaving. Children grow used to your face. The tribe is not your blood, but it begins to feel like something close to home.
Survival is no longer enough.
You choose what you will become to them.
<div class="intro-divider"></div>
<div class="hub-buttons">
<<button "Protect them from threats seen and unseen">>
<<set $introLateChoice = "protector">>
<<set $strength += 1>>
<<set $endurance += 1>>
<<goto "TheLateYears">>
<</button>>
<<button "Take mates among them, weaving your blood into their future">>
<<set $introLateChoice = "bloodline">>
<<set $pops += 3>>
<<set $endurance += 2>>
<<goto "TheLateYears">>
<</button>>
<<button "Teach them to plan, store, and build for what comes next">>
<<set $introLateChoice = "guidance">>
<<set $wisdom += 1>>
<<set $stewardship += 1>>
<<goto "TheLateYears">>
<</button>>
<<button "Lift their spirits until they believe they are meant to endure">>
<<set $introLateChoice = "inspiration">>
<<set $charisma += 1>>
<<set $leadership += 1>>
<<goto "TheLateYears">>
<</button>>
</div>
</div>''<<silently>>
<<set $leadership += 1>>
<<set $stewardship += 1>>
<</silently>>
''<div class="intro-grounded intro-prologue-shell no-click-sfx">
<<if $introLateChoice is "protector">>
You become the camp's shield. When predators circle, you stand between teeth and flesh. When strangers test the edge of your hunting grounds, your presence alone is often enough to turn them away. You teach the warriors what you can, but everyone knows the first defense is still you.
<div class="intro-notification good">Strength rises.</div>
<div class="intro-notification good">Endurance rises.</div>
<<elseif $introLateChoice is "bloodline">>
You take mates among the tribe, and in the years that follow, children are born with traces of you in them - your eyes, your height, your strange resilience. Your blood enters the tribe's future, carried by those who will one day call you ancestor.
<div class="intro-figure">
<<nsfwimgnew "images/events/Intro/PopSwell.png">>
</div>
<div class="intro-notification good">Endurance rises.</div>
<div class="intro-notification good">Population increases.</div>
<<elseif $introLateChoice is "guidance">>
You teach them to think beyond the next hunger. Hunts are planned instead of chased. Stores are counted instead of guessed. Camps are placed with care. Slowly, the tribe becomes more than people surviving beside one another. Something more.
<div class="intro-notification good">Wisdom rises.</div>
<div class="intro-notification good">Stewardship rises.</div>
<<else>>
You give shape to their fear and names to their hopes. Around the fire, you speak of what they have survived and what they may yet become. Songs change. Rituals begin. The tribe starts to believe endurance is not luck, but destiny.
<div class="intro-notification good">Charisma rises.</div>
<div class="intro-notification good">Leadership rises.</div>
<</if>>
Years pass.
Then decades.
At first, the signs are easy to ignore.
You learn too quickly. Wounds close cleanly. Fever passes over you. Strength that should fade does not fade.
The tribe ages.
You do not.
<div class="hub-buttons">
<<button "And still, you remain.">>
<<goto "generations">>
<</button>>
</div>
</div>''<<nobr>>
<<run setup.traditions && setup.traditions.ensureState ? setup.traditions.ensureState() : null>>
<div class="traditions-shell">
<header class="traditions-header">
<div>
<span class="traditions-kicker">Age 1 Customs</span>
<h1 class="traditions-title">Traditions</h1>
</div>
<p class="traditions-lead">These are habits older than law. Movement, authority, survival, desire, order, and sacred command bend through repeated choices before anyone writes them down.</p>
</header>
<div class="traditions-mount" data-traditions-mount></div>
<footer class="traditions-footer">
<p class="traditions-note">Customs drift through actions. Staying, migration, authority assignments, raids, stores, stability, mandates, and alliances already read from these values.</p>
<button type="button" class="traditions-return" onclick="SugarCube.setup.traditions.exit()">Return</button>
</footer>
</div>
<</nobr>><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true, blockTip: "This tribe cannot be reached right now." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockTip = _directAccess?.blockTip ?? "This tribe cannot be reached right now.">>
<<set _isMember = (_tid && setup.federation && setup.federation.isMember) ? setup.federation.isMember(_tid) : false>>
<<set _bindCd = (_tid && setup.tribes && setup.tribes.getBindingCooldownRemaining) ? setup.tribes.getBindingCooldownRemaining(_tid) : 0>>
<</silently>>
''<div class="hub-textbox federation-offer-text">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<<print _directBlockTip>>
<<elseif _isMember>>
The <<print _t.name ?? "tribe">> already stand with you beneath the shared fire. Their voice is counted among your federation.
<<elseif _bindCd > 0>>
Your offer has already been carried to the <<print _t.name ?? "tribe">> this turn. Pressing again now would be too much.
<<else>>
You ask the <<print _t.name ?? "tribe">> to stand with your people, facing whatever may come as one.
<br><br>
You use honeyed words to make it sound appealing: not surrender, not tribute, but a promise that your peoples will face the dark together and speak as members of a greater whole.
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and _directAllowed and not _isMember and _bindCd lte 0>>
<<button "Offer to stand together">><<goto "Tribe_Friendly_BindTribe_Resolve">><</button>>
<<elseif _t and not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Offer to stand together</span>
<<elseif _t and not _isMember>>
<span class="macro-button disabled" title="Offer already sent this turn.">Offer already sent</span>
<<elseif _t and _isMember>>
<<button "Open Federation">><<goto "Federation">><</button>>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true, blockTip: "This tribe cannot be reached right now." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockTip = _directAccess?.blockTip ?? "This tribe cannot be reached right now.">>
<<set _isMember = (_tid && setup.federation && setup.federation.isMember) ? setup.federation.isMember(_tid) : false>>
<<set _bindCd = (_tid && setup.tribes && setup.tribes.getBindingCooldownRemaining) ? setup.tribes.getBindingCooldownRemaining(_tid) : 0>>
<<if _t and not _directAllowed>>
<<set _check = { ok:false, blocked:true, acceptance:0, roll:100, outcomeLabel:"Unavailable", outcomeClass:"is-fail", summary:_directBlockTip, drivers:[] }>>
<<elseif _t and not _isMember and _bindCd > 0>>
<<set _check = (setup.federation && setup.federation.getBindingAcceptance) ? setup.federation.getBindingAcceptance(_tid) : { ok:false, blocked:true, acceptance:0, roll:100, outcomeLabel:"Blocked", outcomeClass:"is-fail", summary:"Federation acceptance is unavailable.", drivers:[] }>>
<<set _check.ok = false>>
<<set _check.blocked = true>>
<<set _check.cooldownBlocked = true>>
<<set _check.roll = 100>>
<<set _check.outcomeLabel = "Offer Already Sent">>
<<set _check.outcomeClass = "is-fail">>
<<set _check.summary = "This tribe has already heard your federation offer this turn. Try again next turn.">>
<<else>>
<<if _t and not _isMember and setup.tribes && setup.tribes.setBindingCooldown>><<run setup.tribes.setBindingCooldown(_tid, 1)>><</if>>
<<set _check = (setup.federation && setup.federation.rollBindingAcceptance) ? setup.federation.rollBindingAcceptance(_tid) : { ok:false, blocked:true, acceptance:0, roll:100, outcomeLabel:"Blocked", outcomeClass:"is-fail", summary:"Federation acceptance is unavailable.", drivers:[] }>>
<</if>>
<<set _success = !!(_check && _check.ok && !_check.alreadyMember)>>
<<if _t and !_success and !_check.blocked and !_check.alreadyMember and setup.flaws and setup.flaws.addPressure>>
<<set _bindPressure = Number(_check.acceptance ?? 0) < 35 ? 20 : 15>>
<<run setup.flaws.addPressure("prideful", _bindPressure)>>
<</if>>
<<set _fedAdd = null>>
<<if _t and _success>>
<<set _fedAdd = setup.federation.addMember(_tid)>>
<<set $uiUnlocks = $uiUnlocks ?? {}>>
<<set $uiUnlocks.diplomacy = true>>
<<run setup.federation && setup.federation.unlockSidebar && setup.federation.unlockSidebar()>>
<<if _fedAdd and _fedAdd.added and $questFlags and $questFlags.q_dominate_region_started>><<updateVictory_DominateRegion>><</if>>
<</if>>
<</silently>>
''<div class="hub-textbox federation-resolve-text">
<<if !_t>>
No tribe is selected.
<<else>>
The offer is carried into the open, where pride, fear, need, and memories of past interactions all have their say.
<br><br>
<div class="result-list result-list-check">
<<if _check.outcomeClass is "is-pass">>
<div class="result-line federation-answer-line fed-pass"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<<elseif _check.outcomeClass is "is-fail">>
<div class="result-line federation-answer-line fed-fail"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<<else>>
<div class="result-line federation-answer-line fed-neutral"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<</if>>
<div class="federation-acceptance-card">
<div class="federation-acceptance-head">
<span class="federation-acceptance-title">Acceptance</span>
<span class="federation-acceptance-value"><<print _check.acceptance>>%</span>
</div>
<<print '<div class="federation-acceptance-meter" style="--fed-acceptance:' + _check.acceptance + '%;"><span></span></div>'>>
<div class="federation-acceptance-drivers"><<nobr>>
<<for _i = 0; _i < _check.drivers.length; _i++>>
<<set _driver = _check.drivers[_i]>>
<<print setup.federation.renderAcceptanceDriver(_driver)>>
<</for>>
<</nobr>></div>
</div>
<<if !_check.blocked>>
<div class="result-line"><span class="label">d100 at or under acceptance</span><span class="value"><<print _check.roll>> / <<print _check.acceptance>></span></div>
<<else>>
<div class="result-line bad"><span class="label">Offer status</span><span class="value"><<print _check.summary>></span></div>
<</if>>
</div>
<br><br>
<<if _check.alreadyMember>>
They already stand beneath your shared fire. This offer becomes a reaffirmation, not a new binding.
<<elseif _success>>
You get your answer quickly. Its spoken quietly at first, perhaps a bit unasuredly. But it isn't long before confidence in their decision can be heard in their voices. "<<print _t.name ?? "tribe">> will stand with you" rings out, and night long celebrations follow.
<div class="result-list">
<<if _fedAdd and _fedAdd.added>><div class="result-line good"><span class="label">Federation result</span><span class="value">Member added</span></div>
<<elseif _fedAdd and _fedAdd.alreadyMember>><div class="result-line good"><span class="label">Federation result</span><span class="value">Already a member</span></div>
<<else>><div class="result-line good"><span class="label">Federation result</span><span class="value">Federation updated</span></div><</if>>
<div class="result-line good"><span class="label">Federation</span><span class="value"><<print $federation?.name ?? "Player Federation">></span></div>
<div class="result-line good"><span class="label">Sidebar</span><span class="value">Federation unlocked</span></div>
</div>
<<else>>
The answer comes back from their leader quickly. A resounding "No". More trust, more proof, or a smaller federation will be needed before they bind their fate to yours.
<</if>>
<div class="hub-buttons federation-resolve-actions">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
<<if _t and (_success or _check.alreadyMember)>><<button "Go to Federation">><<goto "Federation">><</button>><</if>>
</div>
<</if>>
</div>''<<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _availability = (setup.mishan && setup.mishan.getBreakTributeAvailability) ? setup.mishan.getBreakTributeAvailability(_tid) : { ok:false, blocked:true, summary:"Break Tribute is unavailable." }>>
<<set _goods = Math.max(0, Number($goods ?? 0))>>
<<set _breakTuning = setup.mishan?.tuning?.breakTribute ?? {}>>
<<set _smallCost = Number(_breakTuning.giftCosts?.small ?? 5)>>
<<set _largeCost = Number(_breakTuning.giftCosts?.large ?? 15)>>
<</silently>>
''<div class="hub-textbox federation-offer-text">
<<if !_t>>
No tribe is selected.
<<elseif not _availability.ok>>
<<print _availability.summary>>
<<else>>
Mishan's demands are not merely a burden of goods. Every tribe that continues to answer Kavonok strengthens the appearance of his rule.
<br><br>
You ask the <<print _t.name ?? "tribe">> to stop paying tribute and take the risk of standing outside Mishan's protection.
<br><br>
Words may be enough. Gifts may make the risk easier to swallow.
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and _availability.ok>>
<<button "Make the case">>
<<set $mishanBreakTributePending = { tribeId:_tid, gift:"none", turn:setup.mishan.getCurrentTurn(), resolved:false }>>
<<goto "Tribe_Friendly_BreakTribute_Resolve">>
<</button>>
<<if _goods >= _smallCost>>
<<button "Bring a small gift (-5 Goods)">>
<<set $mishanBreakTributePending = { tribeId:_tid, gift:"small", turn:setup.mishan.getCurrentTurn(), resolved:false }>>
<<goto "Tribe_Friendly_BreakTribute_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires 5 Goods.">Bring a small gift (-5 Goods)</span>
<</if>>
<<if _goods >= _largeCost>>
<<button "Bring a large gift (-15 Goods)">>
<<set $mishanBreakTributePending = { tribeId:_tid, gift:"large", turn:setup.mishan.getCurrentTurn(), resolved:false }>>
<<goto "Tribe_Friendly_BreakTribute_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires 15 Goods.">Bring a large gift (-15 Goods)</span>
<</if>>
<<elseif _t>>
<span class="macro-button disabled" title="<<print _availability.summary>>">Break Tribute</span>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _pending = $mishanBreakTributePending>>
<<set _gift = (_pending && String(_pending.tribeId ?? "") is String(_tid ?? "")) ? (_pending.gift ?? "none") : "none">>
<<set _result = (setup.mishan && setup.mishan.resolveBreakTribute) ? setup.mishan.resolveBreakTribute(_tid, { gift:_gift }) : { ok:false, blocked:true, success:false, summary:"Break Tribute is unavailable." }>>
<</silently>>
''<div class="hub-textbox federation-resolve-text">
<<if !_t>>
No tribe is selected.
<<else>>
The council weighs the cost of refusing Kavonok against the risk of continuing to strengthen his rule.
<br><br>
<div class="result-list result-list-check">
<<if _result.ok and _result.success>>
<div class="result-line good"><span class="label">Charisma check</span><span class="value">SUCCESS</span></div>
<<elseif _result.ok>>
<div class="result-line bad"><span class="label">Charisma check</span><span class="value">FAIL</span></div>
<<else>>
<div class="result-line bad"><span class="label">Attempt status</span><span class="value">UNAVAILABLE</span></div>
<</if>>
<<if _result.ok>>
<div class="result-line"><span class="label">Roll</span><span class="value">d20 = <<print _result.roll>></span></div>
<div class="result-line"><span class="label">Charisma + d20 vs DC</span><span class="value"><<print _result.total>> / <<print _result.dc>></span></div>
<<else>>
<div class="result-line"><span class="label">Reason</span><span class="value"><<print _result.summary>></span></div>
<</if>>
</div>
<<if _result.ok>>
<br><br>
<<if _result.success>>
The tribe's speakers choose the danger of independence. They will not yet bind themselves to your federation, but neither will they continue to bow to Mishan.
<<else>>
The council will not risk Kavonok's answer. Their tribute continues, and Mishan takes note of your interference.
<</if>>
<div class="result-list">
<<if _result.giftCost > 0>><div class="result-line bad"><span class="label">Goods spent</span><span class="value">-<<print _result.giftCost>></span></div><</if>>
<<if _result.success>>
<div class="result-line good"><span class="label">Tribute</span><span class="value">Broken</span></div>
<<else>>
<div class="result-line bad"><span class="label">Tribute</span><span class="value">Unchanged</span></div>
<</if>>
<div class="result-line bad"><span class="label">Mishan Anger</span><span class="value">+<<print _result.angerDelta>></span></div>
<<if _result.success>>
<div class="result-line good"><span class="label">Mood</span><span class="value">Grateful — <<print _result.gratefulTurns>> turns</span></div>
<div class="result-line good"><span class="label">Breathing room</span><span class="value">Mishan cannot re-subjugate them for <<print _result.graceTurns>> turns</span></div>
<div class="result-line good"><span class="label">Divine Signs</span><span class="value"><<print setup.mishan.getDivineSignsLines(_result).join(" · ")>></span></div>
<</if>>
</div>
<</if>>
<div class="hub-buttons federation-resolve-actions">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div>
<</if>>
</div>''<<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true, blockTip: "This tribe cannot be reached right now." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockTip = _directAccess?.blockTip ?? "This tribe cannot be reached right now.">>
<<set _peaceOathRemaining = (_tid && setup.tribes && setup.tribes.getPeaceOathRemaining) ? setup.tribes.getPeaceOathRemaining(_tid) : 0>>
<<set _isFedMember = (_tid && setup.federation && setup.federation.isMember) ? setup.federation.isMember(_tid) : false>>
<</silently>>
''<div class="hub-textbox peace-oath-text">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<<print _directBlockTip>>
<<elseif _isFedMember>>
The <<print _t.name ?? "tribe">> already share your federation oath. No separate peace oath is needed; the federation already forbids raids and tribute between your fires.
<<elseif _peaceOathRemaining > 0>>
The oath already stands between your fires and theirs. For now, even anger must walk around it.
<br><br>
It will hold for <<print _peaceOathRemaining>> more turn<<if _peaceOathRemaining isnot 1>>s<</if>>.
<<else>>
Peace is not mercy. Mercy is soft, temporary, and easily mistaken for weakness.
<br><br>
An oath is harder. It asks both sides to put a name to restraint, to bind pride with witnessed words, perhaps exchange blood, or something else. Traditions differ of course, but the intent, the meaning stays the same. He who breaks it will suffer great retribution. Perhaps from their victims. Perhaps from something else.
<br><br>
If they accept, neither side will press tribute or raids against the other while the oath holds.
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Propose terms</span>
<<elseif _t and _isFedMember>>
<span class="macro-button disabled" title="Already covered by your federation oath.">Federation covers this</span>
<<elseif _t and _peaceOathRemaining <= 0>>
<<button "Propose terms">><<goto "Tribe_Friendly_PeaceOath_Resolve">><</button>>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _duration = 8>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true, blockTip: "This tribe cannot be reached right now." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockTip = _directAccess?.blockTip ?? "This tribe cannot be reached right now.">>
<<if _t and not _directAllowed>>
<<set _check = { ok:false, blocked:true, acceptance:0, roll:100, outcomeLabel:"Unavailable", outcomeClass:"is-fail", summary:_directBlockTip, drivers:[] }>>
<<else>>
<<set _check = (setup.tribes && setup.tribes.rollPeaceOathAcceptance) ? setup.tribes.rollPeaceOathAcceptance(_tid) : { ok:false, blocked:true, acceptance:0, roll:100, outcomeLabel:"Blocked", outcomeClass:"is-fail", summary:"Peace oath acceptance is unavailable.", drivers:[] }>>
<</if>>
<<set _success = !!(_check && _check.ok && !_check.blocked)>>
<<set _canResolve = !!_t and !_check.blocked>>
<<set _relDelta = 0>>
<<set $pridefulPeaceOathPressureTurns = $pridefulPeaceOathPressureTurns ?? {}>>
<<set _pressureKey = String(_tid ?? "") + "@" + String(Number($turn ?? 0))>>
<<if _canResolve>>
<<set _relDelta = (setup.tribes && setup.tribes.getRelationDelta) ? setup.tribes.getRelationDelta(_t, _success ? 10 : -10) : (_success ? 10 : -10)>>
<<if setup.traits and setup.traits.modifyPoliticalRelationDelta>><<set _relDelta = setup.traits.modifyPoliticalRelationDelta(_relDelta, "tribePeaceOath")>><</if>>
<<if setup.flaws and setup.flaws.modifyPoliticalRelationDelta>><<set _relDelta = setup.flaws.modifyPoliticalRelationDelta(_relDelta, "tribePeaceOath", { success: _success })>><</if>>
<<if !_success and !($pridefulPeaceOathPressureTurns[_pressureKey]) and setup.flaws and setup.flaws.addPressure>><<run setup.flaws.addPressure("prideful", 15)>><<set $pridefulPeaceOathPressureTurns[_pressureKey] = true>><</if>>
<<set _t.relations = (setup.tribes && setup.tribes._clamp) ? setup.tribes._clamp(Number(_t.relations ?? 0) + _relDelta, -100, 100) : Math.max(-100, Math.min(100, Number(_t.relations ?? 0) + _relDelta))>>
<</if>>
<<if _canResolve and _success>>
<<run setup.tribes && setup.tribes.setPeaceOath && setup.tribes.setPeaceOath(_tid, _duration)>>
<<run setup.tribes && setup.tribes.setMood && setup.tribes.setMood(_tid, "calm", _duration)>>
<<run setup.tribes && setup.tribes.recalcDerived && setup.tribes.recalcDerived(_t)>>
<<run setup.ui && setup.ui.updateOtherTribes && setup.ui.updateOtherTribes()>>
<</if>>
<</silently>>
''<div class="hub-textbox peace-oath-resolve-text">
<<if !_t>>
No tribe is selected.
<<else>>
You lay out the terms: no tribute, no raids, no blood taken from either of your tribes.
<br><br>
<div class="result-list result-list-check">
<<if _check.outcomeClass is "is-pass">>
<div class="result-line federation-answer-line fed-pass"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<<elseif _check.outcomeClass is "is-fail">>
<div class="result-line federation-answer-line fed-fail"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<<else>>
<div class="result-line federation-answer-line fed-neutral"><span class="label">Council answer</span><span class="value"><<print _check.outcomeLabel>></span></div>
<</if>>
<div class="federation-acceptance-card">
<div class="federation-acceptance-head">
<span class="federation-acceptance-title">Acceptance</span>
<span class="federation-acceptance-value"><<print _check.acceptance>>%</span>
</div>
<<print '<div class="federation-acceptance-meter" style="--fed-acceptance:' + _check.acceptance + '%;"><span></span></div>'>>
<div class="federation-acceptance-drivers"><<nobr>>
<<for _i = 0; _i < _check.drivers.length; _i++>>
<<set _driver = _check.drivers[_i]>>
<<print setup.federation.renderAcceptanceDriver(_driver)>>
<</for>>
<</nobr>></div>
</div>
<<if !_check.blocked>>
<div class="result-line"><span class="label">d100 at or under acceptance</span><span class="value"><<print _check.roll>> / <<print _check.acceptance>></span></div>
<<else>>
<div class="result-line bad"><span class="label">Offer status</span><span class="value"><<print _check.summary>></span></div>
<</if>>
</div>
<br><br>
<<if _check.federationBlocked>>
This tribe already sits inside your federation. The broader oath covers the same restraint, so there is nothing separate to swear.
<<elseif _check.alreadyActive>>
The oath is already sworn. Pressing them again would make your promise look hungry.
<<elseif _success>>
Their answer comes slowly, but it comes. Eyes move from weapons to you and your hunters. The oath is repeated back to you, rough-edged but whole.
<br><br>
For a time, you willl be able to sleep without worrying about their raiders arriving in the night. Perhaps a first step to something more long lasting, or maybe just a bit of breathing room before you take everything they have. Only you know.
<div class="result-list">
<div class="result-line good"><span class="label">Peace oath</span><span class="value"><<print _duration>> turns</span></div>
<div class="result-line good"><span class="label">Hostile actions</span><span class="value">Raid and Tribute blocked</span></div>
</div>
<<else>>
The words do not take root. You see it. They arent convinced. Perhaps they don't trust you to uphold your end of the oath...Perhaps they simply consider you to be too easy of pray to let go, even for a bit.
<br><br>
Either way, no oath is sworn today.
<</if>>
<div class="hub-buttons peace-oath-resolve-actions">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div>
<</if>>
</div>''<<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set $tribeFriendlyVisitLastTurn = $tribeFriendlyVisitLastTurn ?? {}>>
<<set _turnNow = (setup.tribes && setup.tribes.getTurnNow) ? setup.tribes.getTurnNow() : Number($turn ?? 0)>>
<<set _used = !!(_tid and Number($tribeFriendlyVisitLastTurn[_tid] ?? -999999) is _turnNow)>>
<<set _goods = Number($goods ?? 0)>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _used>>
You have already sat by this tribe's fires this turn. Another visit now would feel less like diplomacy and more like pressure.
<<else>>
You approach without weapons in your hands, letting their sentries see you before they have to decide whether to fear you.
<br><br>
A friendly visit. Words matter, but so do empty hands, full hands, and in general what lies between them.
<br><br>
You can rely on your presence alone, offer a modest token, or arrive with a gift large enough to make sure things proceed smoothly
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and not _used and _directAllowed>>
<<button "Your presence is enough">>
<<set $tribeFriendlyVisitGift = "none">>
<<goto "Tribe_Friendly_Visit_Resolve">>
<</button>>
<<if _goods >= 5>>
<<button "Bring a small gift (-5 Goods)">>
<<set $tribeFriendlyVisitGift = "small">>
<<goto "Tribe_Friendly_Visit_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires 5 Goods.">Bring a small gift (-5 Goods)</span>
<</if>>
<<if _goods >= 15>>
<<button "Bring a large gift (-15 Goods)">>
<<set $tribeFriendlyVisitGift = "large">>
<<goto "Tribe_Friendly_Visit_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires 15 Goods.">Bring a large gift (-15 Goods)</span>
<</if>>
<<elseif _t and not _used and not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Visit</span>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<<set $tribeFriendlyVisitLastTurn = $tribeFriendlyVisitLastTurn ?? {}>>
<<set _turnNow = (setup.tribes && setup.tribes.getTurnNow) ? setup.tribes.getTurnNow() : Number($turn ?? 0)>>
<<set _used = !!(_tid and Number($tribeFriendlyVisitLastTurn[_tid] ?? -999999) is _turnNow)>>
<<set _gift = $tribeFriendlyVisitGift ?? "none">>
<<if not (_gift is "small" or _gift is "large")>><<set _gift = "none">><</if>>
<<set _giftCost = (_gift is "large") ? 15 : ((_gift is "small") ? 5 : 0)>>
<<set _dc = (_gift is "large") ? 5 : ((_gift is "small") ? 11 : 16)>>
<<if setup.traits and setup.traits.applyPoliticalDc>><<set _dc = setup.traits.applyPoliticalDc(_dc, "tribeVisit")>><</if>>
<<set _giftLabel = (_gift is "large") ? "Large gift" : ((_gift is "small") ? "Small gift" : "No gift")>>
<<set _terrainData = (_t and setup.raidV1 and setup.raidV1.getTerrainDataForTarget) ? setup.raidV1.getTerrainDataForTarget(_t) : null>>
<<set _terrainKey = _terrainData?.key ?? "open">>
<<set _stat = setup.player.getStatForCheck("charisma")>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = _total >= _dc>>
<<set _relGain = 0>>
<<set _relLoss = 0>>
<<set _canResolve = !!_t and _directAllowed and not _used and Number($goods ?? 0) >= _giftCost>>
<<if _canResolve>>
<<if _giftCost > 0>><<set $goods = Math.max(0, Number($goods ?? 0) - _giftCost)>><</if>>
<<set $tribeFriendlyVisitLastTurn[_tid] = _turnNow>>
<<if _success>>
<<set _relGain = (_gift is "large") ? random(13,15) : ((_gift is "small") ? random(10,13) : random(8,10))>>
<<set _relGain = (setup.tribes && setup.tribes.getRelationDelta) ? setup.tribes.getRelationDelta(_t, _relGain) : _relGain>>
<<if setup.traits and setup.traits.modifyPoliticalRelationDelta>><<set _relGain = setup.traits.modifyPoliticalRelationDelta(_relGain, "tribeVisit")>><</if>>
<<if setup.flaws and setup.flaws.modifyPoliticalRelationDelta>><<set _relGain = setup.flaws.modifyPoliticalRelationDelta(_relGain, "tribeVisit", { success: true, gift: _gift })>><</if>>
<<set _t.relations = (setup.tribes && setup.tribes._clamp) ? setup.tribes._clamp(Number(_t.relations ?? 0) + _relGain, -100, 100) : Math.max(-100, Math.min(100, Number(_t.relations ?? 0) + _relGain))>>
<<run setup.tribes && setup.tribes.setMood && setup.tribes.setMood(_tid, "grateful", 3)>>
<<elseif _gift is "none">>
<<set _relLoss = random(3,6)>>
<<set _relLossSigned = (setup.tribes && setup.tribes.getRelationDelta) ? setup.tribes.getRelationDelta(_t, 0 - _relLoss) : (0 - _relLoss)>>
<<if setup.traits and setup.traits.modifyPoliticalRelationDelta>><<set _relLossSigned = setup.traits.modifyPoliticalRelationDelta(_relLossSigned, "tribeVisit")>><</if>>
<<if setup.flaws and setup.flaws.modifyPoliticalRelationDelta>><<set _relLossSigned = setup.flaws.modifyPoliticalRelationDelta(_relLossSigned, "tribeVisit", { success: false, gift: _gift })>><</if>>
<<set _relLoss = Math.abs(_relLossSigned)>>
<<set _t.relations = (setup.tribes && setup.tribes._clamp) ? setup.tribes._clamp(Number(_t.relations ?? 0) - _relLoss, -100, 100) : Math.max(-100, Math.min(100, Number(_t.relations ?? 0) - _relLoss))>>
<</if>>
<<if !_success and setup.flaws and setup.flaws.addPressure>><<run setup.flaws.addPressure("prideful", 10)>><</if>>
<<run setup.tribes && setup.tribes.recalcDerived && setup.tribes.recalcDerived(_t)>>
<<run setup.ui && setup.ui.updateCivilization && setup.ui.updateCivilization()>>
<<run setup.ui && setup.ui.updateOtherTribes && setup.ui.updateOtherTribes()>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _used>>
This visit has already been spent this turn. Their attention has moved on, and so should yours.
<<elseif not _canResolve>>
You reach for the promised gift and find the promise larger than your stores. Better to return before the insult can become public.
<<else>>
<<if _terrainKey is "forest">>
The way into their camp passes beneath heavy boughs and old shadow. Smoke catches in the leaves above you, turning every greeting into something quiet and close.
<<elseif _terrainKey is "mountain">>
The way into their camp climbs through stone and narrow footing. Voices carry strangely here, bouncing from rock to rock before settling around the fires.
<<elseif _terrainKey is "river">>
The way into their camp follows the riverbank, where wet stones gleam and every pause is filled by the sound of moving water.
<<else>>
The way into their camp crosses open ground. Nothing hides the shape of your approach, so you make the honesty of it part of the message.
<</if>>
<br><br>
<div class="result-list result-list-check">
<div class="result-line result-line-check-outcome <<if _success>>is-pass<<else>>is-fail<</if>>">
<span class="label">Charisma check</span>
<span class="value"><<if _success>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label">Charisma + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
</div>
<br><br>
<<if _success>>
<<if _gift is "large">>
There are shocked murmurs around the camp as you have your men carry the various goods you have and shower the tribe with them. There is still suspicon though...Well for a while at least. It isn't long before your silver tongue wins over the doubters as well.
<<nsfwimgnew "images/events/visit/large_gift.png">>
...Some with more direct means that others.
By the time you leave, the gift, as well as your visit as a whole, has become a story they are already retelling.
<<elseif _gift is "small">>
The visit warms slowly, but it warms. The gift is taken without much fanfare, with your charisma doing most of the heavy lifting. And lift it does. By the time you leave you have made a few new friends...Or well, thats at least how they see it.
Either way, you left an impression.
<<else>>
Against the odds, they are insulted at first, of course. But you know just what to say, how to say it, and above all of that...Your presence feels good. Natural. After some drinks are shared, you even manage to convince two local woman to "show you around". Away from the others.
<<nsfwimgnew "images/events/visit/charisma.png">>
...They prove themselves quite dedicated to it. By the time you leave, you've managed to make, perhaps suprisingly, quite a good impression.
<</if>>
<<else>>
<<if _gift is "none">>
Without a gift to soften the tension, the visit proves...Less than fruitfuil. In fact, it would be safe to say, that your hosts were quite insulted by your visit. Not everyone is aware what a privilage it is to stand in your presence after all.
<<else>>
The gift keeps the failure from souring into an insult, but the endeavour could have been more succsesful.
<</if>>
<</if>>
<div class="result-list">
<<if _giftCost > 0>><div class="result-line bad"><span class="label">Goods spent</span><span class="value">-<<print _giftCost>></span></div><</if>>
<<if _relGain > 0>><div class="result-line good"><span class="label">Relations</span><span class="value">+<<print _relGain>></span></div><</if>>
<<if _relLoss > 0>><div class="result-line bad"><span class="label">Relations</span><span class="value">-<<print _relLoss>></span></div><</if>>
<<if not _success and _giftCost > 0>><div class="result-line"><span class="label">Relations</span><span class="value">No loss</span></div><</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _cooldown = (_tid && setup.tribes && setup.tribes.getHostileActionCooldownRemaining) ? setup.tribes.getHostileActionCooldownRemaining(_tid, "migration") : 0>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _cooldown > 0>>
You pressed this tribe recently. They are still watching the tree line and keeping their distance.
<<else>>
You let the matter be stated plainly.
<br><br>
Their camp sits too close to yours. On good land. YOUR land. Their fires eat sky that should belong to you.
<br><br>
And as the words leave your mouth, the result soon becomes clear
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and _directAllowed and _cooldown lte 0>>
<<button "Demand They Move Camp">>
<<goto "Tribe_Hostile_ForceMigration_Resolve">>
<</button>>
<<elseif _t and not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Demand They Move Camp</span>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _r = (_tid && setup.tribes && setup.tribes.resolveHostileDemand) ? setup.tribes.resolveHostileDemand(_tid, { kind: "migration" }) : null>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _tTemp = _t ? (_t.temperament ?? "normal") : "normal">>
<<set _tMood = _t ? ((setup.tribes.getMoodState && setup.tribes.getMoodState(_t)) ?? (_t.mood?.state ?? "none")) : "none">>
<<if _r and not _r.blocked>>
<<set _strContrib = Math.round(Number(_r.playerMil ?? 0) * 3 * 10) / 10>>
<<set _chrContrib = Math.round(Number(_r.charisma ?? 0) * 2 * 10) / 10>>
<<set _enemyContrib = Math.round(Number(_r.enemyMil ?? 0) * 3 * 10) / 10>>
<<set _rollShift = Number(_r.rollShift ?? 0)>>
<<set _tempMod = Number(_r.dc?.temperamentMod ?? 0)>>
<<set _moodMod = Number(_r.dc?.moodMod ?? 0)>>
<<set _politicalMod = Number(_r.dc?.politicalMod ?? 0)>>
<<set _pridefulMod = Number(_r.dc?.pridefulMod ?? 0)>>
<<set _strengthDiff = Math.round((_strContrib - _enemyContrib) * 10) / 10>>
<<set _traitsFlawsMod = _politicalMod + _pridefulMod>>
<<set _scorePct = Math.max(0, Math.min(100, Math.round((Number(_r.playerScore ?? 0) / Math.max(1, Number(_r.targetScore ?? 1))) * 100)))>>
<<set _outcomeLabel = _r.success ? "Forced Out" : "Held Position">>
<<set _outcomeClass = _r.success ? "fed-pass" : "fed-fail">>
<<set _strTip = "Your military strength counts triple in the contest. Higher Mil Str makes them more likely to relent.">>
<<set _chrTip = "Your charisma counts double. A more persuasive presence makes the threat land harder.">>
<<set _rollTip = "A d20 was rolled. 17-20 add +2, 13-16 add +1, 9-12 are neutral, 5-8 subtract 1, 1-4 subtract 2.">>
<<set _strengthTip = "Your military strength contribution minus theirs. Your side: +" + _strContrib + ". Their side: +" + _enemyContrib + ".">>
<<set _tempTip = (_tempMod > 0) ? ("Their temperament makes them more stubborn. +" + _tempMod + " to the difficulty.") : ((_tempMod < 0) ? ("Their temperament makes them quicker to relent. " + _tempMod + " to the difficulty.") : "Their temperament has no effect on the difficulty.")>>
<<set _moodTip = (_moodMod > 0) ? ("Their current mood stiffens their resolve. +" + _moodMod + " to the difficulty.") : ((_moodMod < 0) ? ("Their current mood softens them. " + _moodMod + " to the difficulty.") : "Their current mood has no effect on the difficulty.")>>
<<set _traitsFlawsTip = "Combined active trait and flaw modifiers. Political Instinct: " + ((_politicalMod >= 0) ? "+" : "") + _politicalMod + " DC. Prideful: " + ((_pridefulMod >= 0) ? "+" : "") + _pridefulMod + " DC.">>
<<set _strengthTone = (_strengthDiff > 0) ? "is-good" : ((_strengthDiff < 0) ? "is-bad" : "is-neutral")>>
<<set _chrTone = (_chrContrib > 0) ? "is-good" : "is-neutral">>
<<set _rollTone = (_rollShift > 0) ? "is-good" : ((_rollShift < 0) ? "is-bad" : "is-neutral")>>
<<set _tempTone = (_tempMod > 0) ? "is-bad" : ((_tempMod < 0) ? "is-good" : "is-neutral")>>
<<set _moodTone = (_moodMod > 0) ? "is-bad" : ((_moodMod < 0) ? "is-good" : "is-neutral")>>
<<set _traitsFlawsTone = _traitsFlawsMod < 0 ? "is-good" : ((_traitsFlawsMod > 0) ? "is-bad" : "is-neutral")>>
<<set _strengthSign = (_strengthDiff >= 0) ? "+" : "">>
<<set _rollSign = (_rollShift >= 0) ? "+" : "">>
<<set _tempSign = (_tempMod >= 0) ? "+" : "">>
<<set _moodSign = (_moodMod >= 0) ? "+" : "">>
<<set _traitsFlawsSign = (_traitsFlawsMod >= 0) ? "+" : "">>
<</if>>
<</silently>>
''<div class="hub-textbox tribe-hostile-resolve-text">
<<if !_r>>
No tribe is selected.
<<elseif _r.directBlocked>>
<b><<print _r.blockLabel ?? "Unavailable">></b>
<br><br>
<<print _r.blockTip ?? "This direct camp action is not available right now.">>
<<elseif _r.blocked>>
They have already been pressed too recently. For now, they hold their ground and wait to see what you do next.
<<else>>
<<if _r.success>>
Silence spreads around their camp. Some of them want to scream at you, chase you away...But the ones making the decision know better.
<br><br>
You dont get an eager answer, just simple nods.
<br><br>
In the end, they choose distance. After all its better than being close to your wrath.
<<else>>
The threat is heard...And promptly refused.
<br><br>
They do not give you the retreat you demanded. Whatever fear you stirred was not enough to uproot them. All thats left is to remind them why its wise to trust ones instincts.
<</if>>
<br><br>
<div class="result-list result-list-check">
<div class="result-line federation-answer-line <<print _outcomeClass>>"><span class="label">Outcome</span><span class="value"><<print _outcomeLabel>></span></div>
<div class="federation-acceptance-card">
<div class="federation-acceptance-head">
<span class="federation-acceptance-title">Your Score vs Their Resistance</span>
<span class="federation-acceptance-value"><<print _r.playerScore>> / <<print _r.targetScore>></span>
</div>
<<print '<div class="federation-acceptance-meter" style="--fed-acceptance:' + _scorePct + '%;"><span></span></div>'>>
<div class="federation-acceptance-drivers"><<nobr>>
<<print '<div class="federation-acceptance-driver ' + _strengthTone + '" data-tip="' + _strengthTip + '"><span class="k">Strength Difference</span><span class="v">' + _strengthSign + _strengthDiff + '</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _chrTone + '" data-tip="' + _chrTip + '"><span class="k">Your Charisma</span><span class="v">+' + _chrContrib + ' (Cha x2)</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _rollTone + '" data-tip="' + _rollTip + '"><span class="k">Your Roll</span><span class="v">d20: ' + _r.roll + ' (' + _rollSign + _rollShift + ')</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _tempTone + '" data-tip="' + _tempTip + '"><span class="k">Their Temperament</span><span class="v">' + _tTemp + ' (' + _tempSign + _tempMod + ' DC)</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _moodTone + '" data-tip="' + _moodTip + '"><span class="k">Their Mood</span><span class="v">' + _tMood + ' (' + _moodSign + _moodMod + ' DC)</span></div>'>>
<<if _traitsFlawsMod isnot 0>><<print '<div class="federation-acceptance-driver ' + _traitsFlawsTone + '" data-tip="' + _traitsFlawsTip + '"><span class="k">Traits & Flaws</span><span class="v">' + _traitsFlawsSign + _traitsFlawsMod + ' DC</span></div>'>><</if>>
<</nobr>></div>
</div>
</div>
<div class="result-list">
<<if _r.success>>
<div class="result-line good"><span class="label">Camp</span><span class="value">Moved</span></div>
<<else>>
<div class="result-line bad"><span class="label">Camp</span><span class="value">Held Position</span></div>
<</if>>
<div class="result-line bad"><span class="label">Relations</span><span class="value"><<print _r.relationDelta>></span></div>
<div class="result-line bad"><span class="label">Force Migration</span><span class="value">3-turn cooldown</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _ghostWalkCost = 5>>
<<set _hasGhostWalk = !!(setup.powerOwned && setup.powerOwned("ghost_walk"))>>
<<set _already = (_tid && setup.raidV1 && setup.raidV1.isTribeOffenseInfiltrationReady) ? setup.raidV1.isTribeOffenseInfiltrationReady(_tid) : false>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<<set _canUse = !!_t and _directAllowed and _hasGhostWalk and Number($belief ?? 0) >= _ghostWalkCost and not _already>>
<<set _terrainData = _t ? setup.raidV1.getTerrainDataForTarget(_t) : null>>
<<set _terrainKey = _terrainData?.key ?? "open">>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _already>>
You have already threaded yourself through this camp once. The paths are there, the faces already half-ready to accept the shape of you.
<br><br>
One breach is enough. Use it in your next raid before trying to slip inside this tribe again.
<<elseif not _hasGhostWalk>>
This kind of approach asks for more than silence or careful footing. Without Ghost Walk, you would be seen for what you are long before you reached the center of their camp.
<<elseif Number($belief ?? 0) < _ghostWalkCost>>
The shape of the power is clear in your mind, but not the strength to hold it. You need more belief before you can step unseen into their circle.
<<else>>
It takes a step. Two. Three. You leave the camp as $user, but by the time theirs comes into view, you are somebody else.
Somebody familiar.
<br><br>
<<if _terrainKey is "forest">>
Their camp lies under heavy boughs and broken shadow, where sentries trust the brush to hide every approach except the one they already expect.
<<elseif _terrainKey is "mountain">>
Their camp clings to harder ground, with stone and narrow footing forcing people into familiar routes and chokepoints. A place difficult to take by force.
<<elseif _terrainKey is "river">>
Their camp leans toward the water, using the bank as a wall. A sound defense, perhaps...or a willing surrender of their escape route.
<<else>>
Their camp rests in clearer ground, where firelight and habit do most of the guarding.
<</if>>
<br><br>
If you go through with this, the next raid against this tribe will begin with your people already moving through openings the defenders do not know they have shown you.
But being someone else for so long will exact its toll on your powers.
<</if>>
</div>''
<div class="hub-buttons">
<<if _canUse>>
<<button "Walk Their Camp (Ghost Walk: 5 Belief)">>
<<goto "Tribe_Hostile_Infiltrate_Resolve">>
<</button>>
<<else>>
<<set _infiltrateLock = _already
? "This tribe is already infiltrated. Launch a raid against them first."
: (!_directAllowed
? (_directBlockLabel + " - " + _directBlockTip)
: (_hasGhostWalk
? ("Need " + _ghostWalkCost + " Belief.")
: "You have not acquired Ghost Walk."))>>
<span class="macro-button disabled" title="<<print _infiltrateLock>>">Walk Their Camp (Ghost Walk: 5 Belief)</span>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _ghostWalkCost = 5>>
<<set _hasGhostWalk = !!(setup.powerOwned && setup.powerOwned("ghost_walk"))>>
<<set _already = (_tid && setup.raidV1 && setup.raidV1.isTribeOffenseInfiltrationReady) ? setup.raidV1.isTribeOffenseInfiltrationReady(_tid) : false>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<<set _canUse = !!_t and _directAllowed and _hasGhostWalk and Number($belief ?? 0) >= _ghostWalkCost and not _already>>
<<set _terrainData = _t ? setup.raidV1.getTerrainDataForTarget(_t) : null>>
<<set _terrainKey = _terrainData?.key ?? "open">>
<<set _infiltrationBonus = 0>>
<<set _infiltrationExtra = { kind: "none" }>>
<<if _canUse>>
<<set $belief = Math.max(0, Number($belief ?? 0) - _ghostWalkCost)>>
<<set _infiltrationBonus = (setup.raidV1 && setup.raidV1.setTribeOffenseInfiltration) ? setup.raidV1.setTribeOffenseInfiltration(_tid, 3) : 0>>
<<set _infiltrationExtra = (setup.raidV1 && setup.raidV1.resolveInfiltrationExtra) ? setup.raidV1.resolveInfiltrationExtra(_tid) : { kind: "none" }>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _already>>
The opening is already there, waiting inside this tribe's camp. Another pass would only warn them before you have taken advantage of it.
<<elseif not _hasGhostWalk>>
Without Ghost Walk, there is no path through them that does not end in raised voices and grasping hands.
<<elseif not _canUse>>
The power gathers around you for a breath, then thins away. There is not enough belief to make the deception hold.
<<else>>
You step through the edge of their camp as if memory itself has mislaid you.
<br><br>
Faces turn your way and pass on. Guards make room without realizing they have done it. You walk the seams between cookfires, sleeping hides, and weapon stacks, learning where the camp narrows, where the watches thin, and where a sudden rush would bite hardest.
<br><br>
<<if _terrainKey is "forest">>
Beneath the canopy, you mark the blind bends where roots, brush, and smoke will hide a fast-moving charge.
<<elseif _terrainKey is "mountain">>
Among stone ledges and cramped paths, you find the routes that will turn their own footing into a trap once battle begins.
<<elseif _terrainKey is "river">>
Along the waterline, you see where slick banks and firelit reflections will leave their defenders a half-step slow.
<<else>>
In the open lanes between their fires, you pick out the weak points where confidence has made them careless.
<</if>>
<br><br>
When the work is done, you linger.
Your power still holds, after all.
<br><br>
A pretty woman greets you with a smile that was meant for someone else. She says a name you do not know, then takes you gently aside with a fondness you have not earned.
<br><br>
<<nsfwimg "images/events/infiltrate/infiltrate.gif">>
<br><br>
<<if _infiltrationExtra and _infiltrationExtra.kind is "quest">>
While here you also manage to pick up an interesting story. Perhaps its worth following up on it...
<br><br>
<<elseif _infiltrationExtra and _infiltrationExtra.kind is "spoil">>
You also picked up something interesting when nobody was paying much attention...
<br><br>
<</if>>
By the time you leave, the raid has already begun in miniature. The paths have been walked. The weak places remembered.
They do not know it, but a wolf in sheep's clothing has already passed among them.
<div class="result-list">
<div class="result-line good"><span class="label">Belief spent</span><span class="value">-<<print _ghostWalkCost>></span></div>
<div class="result-line good"><span class="label">Next offensive raid</span><span class="value">+<<print _infiltrationBonus>> ATK, +<<print _infiltrationBonus>> DEF, +<<print _infiltrationBonus>> Morale to every player warband</span></div>
<<if _infiltrationExtra and (_infiltrationExtra.kind is "quest" or _infiltrationExtra.kind is "spoil")>>
<div class="result-line good"><span class="label"><<print _infiltrationExtra.label>></span><span class="value"><<print _infiltrationExtra.value>></span></div>
<</if>>
<div class="result-line good"><span class="label">Duration</span><span class="value">Until your next raid against this tribe ends</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _cooldown = (_tid && setup.tribes && setup.tribes.getHostileActionCooldownRemaining) ? setup.tribes.getHostileActionCooldownRemaining(_tid, "tribute") : 0>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
<</silently>>
''<div class="hub-textbox">
<<if !_t>>
No tribe is selected.
<<elseif not _directAllowed>>
<b><<print _directBlockLabel>></b>
<br><br>
<<print _directBlockTip>>
<<elseif _cooldown > 0>>
They have only just weathered one demand from you. Another push right now would find them braced for it.
<<else>>
Tribute is not barter. Not in the classical meaning of the word. Yet still, goods are being exchanged, even if what you offer in return is intangible.
What price can be placed on life after all?
<br><br>
The size of the demand matters. A smaller levy can be extracted with less resistance.
A larger one asks whether they think your reach is truly greater than their pride.
They are, of course, but its up to you to convince them of this.
<</if>>
</div>''
<div class="hub-buttons">
<<if _t and _directAllowed and _cooldown lte 0>>
<<button "Demand Small Tribute">>
<<set $tribeTributeDemandSize = "small">>
<<goto "Tribe_Hostile_Tribute_Resolve">>
<</button>>
<<button "Demand Large Tribute">>
<<set $tribeTributeDemandSize = "large">>
<<goto "Tribe_Hostile_Tribute_Resolve">>
<</button>>
<<elseif _t and not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Tribute</span>
<</if>>
<<button "Go Back">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = (setup.tribes && setup.tribes.getActiveTribeId) ? setup.tribes.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId)>>
<<set _size = String($tribeTributeDemandSize ?? "small")>>
<<set _r = (_tid && setup.tribes && setup.tribes.resolveHostileDemand) ? setup.tribes.resolveHostileDemand(_tid, { kind: "tribute", size: _size }) : null>>
<<set _t = (_tid && setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
<<set _tTemp = _t ? (_t.temperament ?? "normal") : "normal">>
<<set _tMood = _t ? ((setup.tribes.getMoodState && setup.tribes.getMoodState(_t)) ?? (_t.mood?.state ?? "none")) : "none">>
<<if _r and not _r.blocked>>
<<set _strContrib = Math.round(Number(_r.playerMil ?? 0) * 3 * 10) / 10>>
<<set _chrContrib = Math.round(Number(_r.charisma ?? 0) * 2 * 10) / 10>>
<<set _enemyContrib = Math.round(Number(_r.enemyMil ?? 0) * 3 * 10) / 10>>
<<set _rollShift = Number(_r.rollShift ?? 0)>>
<<set _tempMod = Number(_r.dc?.temperamentMod ?? 0)>>
<<set _moodMod = Number(_r.dc?.moodMod ?? 0)>>
<<set _politicalMod = Number(_r.dc?.politicalMod ?? 0)>>
<<set _pridefulMod = Number(_r.dc?.pridefulMod ?? 0)>>
<<set _strengthDiff = Math.round((_strContrib - _enemyContrib) * 10) / 10>>
<<set _traitsFlawsMod = _politicalMod + _pridefulMod>>
<<set _scorePct = Math.max(0, Math.min(100, Math.round((Number(_r.playerScore ?? 0) / Math.max(1, Number(_r.targetScore ?? 1))) * 100)))>>
<<set _outcomeLabel = _r.success ? "Tribute Yielded" : "Demand Refused">>
<<set _outcomeClass = _r.success ? "fed-pass" : "fed-fail">>
<<set _strTip = "Your military strength counts triple in the contest. Higher Mil Str makes them more likely to yield.">>
<<set _chrTip = "Your charisma counts double. A more persuasive presence makes the demand land harder.">>
<<set _rollTip = "A d20 was rolled. 17-20 add +2, 13-16 add +1, 9-12 are neutral, 5-8 subtract 1, 1-4 subtract 2.">>
<<set _strengthTip = "Your military strength contribution minus theirs. Your side: +" + _strContrib + ". Their side: +" + _enemyContrib + ".">>
<<set _tempTip = (_tempMod > 0) ? ("Their temperament makes them more stubborn. +" + _tempMod + " to the difficulty.") : ((_tempMod < 0) ? ("Their temperament makes them quicker to yield. " + _tempMod + " to the difficulty.") : "Their temperament has no effect on the difficulty.")>>
<<set _moodTip = (_moodMod > 0) ? ("Their current mood stiffens their resolve. +" + _moodMod + " to the difficulty.") : ((_moodMod < 0) ? ("Their current mood softens them. " + _moodMod + " to the difficulty.") : "Their current mood has no effect on the difficulty.")>>
<<set _traitsFlawsTip = "Combined active trait and flaw modifiers. Political Instinct: " + ((_politicalMod >= 0) ? "+" : "") + _politicalMod + " DC. Prideful: " + ((_pridefulMod >= 0) ? "+" : "") + _pridefulMod + " DC.">>
<<set _strengthTone = (_strengthDiff > 0) ? "is-good" : ((_strengthDiff < 0) ? "is-bad" : "is-neutral")>>
<<set _chrTone = (_chrContrib > 0) ? "is-good" : "is-neutral">>
<<set _rollTone = (_rollShift > 0) ? "is-good" : ((_rollShift < 0) ? "is-bad" : "is-neutral")>>
<<set _tempTone = (_tempMod > 0) ? "is-bad" : ((_tempMod < 0) ? "is-good" : "is-neutral")>>
<<set _moodTone = (_moodMod > 0) ? "is-bad" : ((_moodMod < 0) ? "is-good" : "is-neutral")>>
<<set _traitsFlawsTone = _traitsFlawsMod < 0 ? "is-good" : ((_traitsFlawsMod > 0) ? "is-bad" : "is-neutral")>>
<<set _strengthSign = (_strengthDiff >= 0) ? "+" : "">>
<<set _rollSign = (_rollShift >= 0) ? "+" : "">>
<<set _tempSign = (_tempMod >= 0) ? "+" : "">>
<<set _moodSign = (_moodMod >= 0) ? "+" : "">>
<<set _traitsFlawsSign = (_traitsFlawsMod >= 0) ? "+" : "">>
<</if>>
<<if _r and _r.success and not _r.blocked>>
<<set _tributeImgPool = [
"images/events/tribute/n1.png",
"images/events/tribute/n2.png",
"images/events/tribute/n3.png",
"images/events/tribute/n4.png",
"images/events/tribute/n5.png",
"images/events/tribute/n6.png"
]>>
<<set _tributeImg = _tributeImgPool[random(0, _tributeImgPool.length - 1)]>>
<<set _tributeAspectGain = (_size is "large") ? 4 : 2>>
<<run setup.aspects && setup.aspects.addPoints ? setup.aspects.addPoints("influence", _tributeAspectGain, "Demand Tribute") : null>>
<</if>>
<</silently>>
''<div class="hub-textbox tribe-hostile-resolve-text">
<<if !_r>>
No tribe is selected.
<<elseif _r.directBlocked>>
<b><<print _r.blockLabel ?? "Unavailable">></b>
<br><br>
<<print _r.blockTip ?? "This direct camp action is not available right now.">>
<<elseif _r.blocked>>
They have already been squeezed too recently. There is no easy fear to harvest from them again just yet.
<<else>>
<div class="result-list result-list-check">
<div class="result-line federation-answer-line <<print _outcomeClass>>"><span class="label">Outcome</span><span class="value"><<print _outcomeLabel>></span></div>
<div class="federation-acceptance-card">
<div class="federation-acceptance-head">
<span class="federation-acceptance-title">Your Score vs Their Resistance</span>
<span class="federation-acceptance-value"><<print _r.playerScore>> / <<print _r.targetScore>></span>
</div>
<<print '<div class="federation-acceptance-meter" style="--fed-acceptance:' + _scorePct + '%;"><span></span></div>'>>
<div class="federation-acceptance-drivers"><<nobr>>
<<print '<div class="federation-acceptance-driver ' + _strengthTone + '" data-tip="' + _strengthTip + '"><span class="k">Strength Difference</span><span class="v">' + _strengthSign + _strengthDiff + '</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _chrTone + '" data-tip="' + _chrTip + '"><span class="k">Your Charisma</span><span class="v">+' + _chrContrib + ' (Cha x2)</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _rollTone + '" data-tip="' + _rollTip + '"><span class="k">Your Roll</span><span class="v">d20: ' + _r.roll + ' (' + _rollSign + _rollShift + ')</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _tempTone + '" data-tip="' + _tempTip + '"><span class="k">Their Temperament</span><span class="v">' + _tTemp + ' (' + _tempSign + _tempMod + ' DC)</span></div>'>>
<<print '<div class="federation-acceptance-driver ' + _moodTone + '" data-tip="' + _moodTip + '"><span class="k">Their Mood</span><span class="v">' + _tMood + ' (' + _moodSign + _moodMod + ' DC)</span></div>'>>
<<if _traitsFlawsMod isnot 0>><<print '<div class="federation-acceptance-driver ' + _traitsFlawsTone + '" data-tip="' + _traitsFlawsTip + '"><span class="k">Traits & Flaws</span><span class="v">' + _traitsFlawsSign + _traitsFlawsMod + ' DC</span></div>'>><</if>>
<</nobr>></div>
</div>
</div>
<br><br>
<<if _r.success>>
The demand lands and they yield rather quickly to your demand. It might not be clear to them if they will have enough to push through the winter now, but its clearer to them at least than the alternative.
<br><br>
While already here, you decide to "celebrate" a fruitful deal.
<br><br>
<<nsfwimgnew _tributeImg "Tribute celebration">>
<br><br>
The men of this tribe grit their teeth and clench their fists. Clearly from happines at the joy you bring their women.
<br><br>
After you are done and return to camp, its not long before the tribute is brought as well.
<<else>>
They do not bend far enough.
<br><br>
Whatever pressure you brought to the meeting, it was not enough to make them pay. Not willingly, at least. Soon enough, they will understand that this was you being merciful.
<</if>>
<br><br>
<div class="result-list">
<<if _r.success>>
<div class="result-line good"><span class="label">Tribute taken</span><span class="value"><<print Math.round(_r.tributePct * 100)>>% of stores</span></div>
<div class="result-line good"><span class="label">Gained</span><span class="value">+<<print _r.tributeFood>> Food, +<<print _r.tributeGoods>> Goods, +<<print _r.tributeResources>> Resources</span></div>
<div class="result-line good"><span class="label">Raid Relief</span><span class="value"><<print _r.raidBlockedTurns>> turns</span></div>
<div class="result-line good"><span class="label">Aspect</span><span class="value">+<<print _tributeAspectGain>> Influence</span></div>
<<else>>
<div class="result-line bad"><span class="label">Tribute</span><span class="value">None</span></div>
<</if>>
<div class="result-line bad"><span class="label">Relations</span><span class="value"><<print _r.relationDelta>></span></div>
<div class="result-line bad"><span class="label">Tribute</span><span class="value">3-turn cooldown</span></div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Return to Tribe">><<goto "Tribe_Info">><</button>>
</div><<silently>>
<<set _tid = $activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId>>
<<set _t = null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and $tribes[_i].id is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !$tribeInfoTab>><<set $tribeInfoTab = "friendly">><</if>>
<<if _tid and $questTargetNpcCamps and $questTargetNpcCamps[_tid]>><<set $tribeInfoTab = "hostile">><</if>>
<<if _inRange is undefined>><<set _inRange = true>><</if>>
<<set $tribeFriendlyVisitLastTurn = $tribeFriendlyVisitLastTurn ?? {}>>
<<set $tribeTradeLastTurn = $tribeTradeLastTurn ?? {}>>
<<set _turnNow = (setup.tribes && setup.tribes.getTurnNow) ? setup.tribes.getTurnNow() : Number($turn ?? 0)>>
<<set _visitUsed = !!(_tid and Number($tribeFriendlyVisitLastTurn[_tid] ?? -999999) is _turnNow)>>
<<set _tradeUsed = !!(_tid and Number($tribeTradeLastTurn[_tid] ?? -999999) is _turnNow)>>
<<if _t>><<set _name = _t.name ?? "Unknown tribe">>
<<set _rel = Number(_t.relations ?? 0)>>
<<set _temp = _t.temperament ?? "normal">>
<<set _mood = (_t.mood && _t.mood.state) ? _t.mood.state : "none">>
<<set _pop = Number((_t.stats && _t.stats.population) ?? (_t.population ?? 0))>>
<<set _res = Number((_t.stats && _t.stats.resources) ?? (_t.resources ?? 0))>>
<<set _mil = Number((_t.stats && _t.stats.milStr) ?? (_t.milStr ?? 0))>>
<<set _migrationCd = (setup.tribes && setup.tribes.getHostileActionCooldownRemaining) ? setup.tribes.getHostileActionCooldownRemaining(_tid, "migration") : 0>>
<<set _tributeCd = (setup.tribes && setup.tribes.getHostileActionCooldownRemaining) ? setup.tribes.getHostileActionCooldownRemaining(_tid, "tribute") : 0>>
<<set _bindCd = (_tid && setup.tribes && setup.tribes.getBindingCooldownRemaining) ? setup.tribes.getBindingCooldownRemaining(_tid) : 0>>
<<set _mishanTributary = !!(_tid && setup.mishan && setup.mishan.isTributary && setup.mishan.isTributary(_tid))>>
<<set _raidBlock = (setup.tribes && setup.tribes.getRaidBlockRemaining) ? setup.tribes.getRaidBlockRemaining(_tid) : 0>>
<<set _peaceOathRemaining = (_tid && setup.tribes && setup.tribes.getPeaceOathRemaining) ? setup.tribes.getPeaceOathRemaining(_tid) : 0>>
<<set _ghostWalkCost = 5>>
<<set _hasGhostWalk = !!(setup.powerOwned && setup.powerOwned("ghost_walk"))>>
<<set _infiltrationReady = (setup.raidV1 && setup.raidV1.isTribeOffenseInfiltrationReady) ? setup.raidV1.isTribeOffenseInfiltrationReady(_tid) : false>>
<<if String(_t.aiPackage ?? "") is "story_only">><<set _inRange = false>><</if>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: !!_inRange, available: !!_inRange, blockLabel: "Too Distant", blockTip: "Their camp is beyond your direct interaction range." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAllowed ? "" : (_directAccess?.blockLabel ?? "Unavailable")>>
<<set _directBlockTip = _directAllowed ? "" : (_directAccess?.blockTip ?? "This direct camp action is not available right now.")>>
<<set _inRange = _directAllowed>>
<<set _tempTip = (_temp is "trader") ? "More willing to trade; less likely to raid." : (_temp is "raider") ? "Aggressive by nature; less open to trade." : (_temp is "wary") ? "Cautious and slow to trust outsiders." : (_temp is "friendly") ? "Open to diplomacy and cooperation." : "A general behavioral tendency of this tribe.">>
<<set _moodTip = (_mood is "angry") ? "Short tempers; negotiations are harder right now." : (_mood is "calm") ? "Stable and receptive; good time for diplomacy." : (_mood is "fearful") ? "On edge and unpredictable. Tread carefully." : (_mood is "emboldened") ? "Feeling confident and assertive this season." : "Their current emotional state this season.">>
<<set _relTip = "How this tribe views your people. Higher relations improve trade and diplomacy; lower relations invite hostility.">>
<<set _tribeImg = _t.portrait ?? (_t.image ?? null)>>
<<if setup.tribeLeaders and setup.tribeLeaders.ensureForTribe>><<run setup.tribeLeaders.ensureForTribe(_t)>><</if>>
<</if>>
<</silently>>
<div class="tribeinfo-wrap tribeinfo-wrap--tribe"><div class="tribeinfo-card"><<if !_t>><div class="tribeinfo-title">TRIBE NOT FOUND</div><div class="tribeinfo-error"><div class="k">Missing tribe:</div><div class="v"><<print _tid>></div></div><div class="tribeinfo-actions"><div class="tribeinfo-btnrow"><<button "Return">><<goto "OtherTribes">><</button>></div></div><<else>><<set _migrationTip = "Action on cooldown - " + _migrationCd + " more turn" + (_migrationCd is not 1 ? "s." : ".")>><<set _tributeTip = "Action on cooldown - " + _tributeCd + " more turn" + (_tributeCd is not 1 ? "s." : ".")>><<set _raidBlockTip = "Raid blocked - tribute pressure lasts " + _raidBlock + " more turn" + (_raidBlock is not 1 ? "s." : ".")>><<set _infiltrateNeedTip = _hasGhostWalk ? ("Requires " + _ghostWalkCost + " Belief - you have " + Number($belief ?? 0) + ".") : "Requires the Ghost Walk power and 5 Belief.">><<set _visitTip = _visitUsed ? "You have already visited this tribe this turn." : "Visit this tribe and try to improve relations. Once per turn.">><<set _tradeTip = _tradeUsed ? "You have already concluded a trade with this tribe this turn." : "Exchange goods with this tribe.">><<set _peaceOathTip = "Peace oath active - " + _peaceOathRemaining + " more turn" + (_peaceOathRemaining isnot 1 ? "s." : ".")>><div class="tribeinfo-title"><<print _name.toUpperCase()>></div><div class="tribeinfo-body"><div class="tribeinfo-left"><div class="tribeinfo-img"><<if _tribeImg>><img src="<<print _tribeImg>>" alt="<<print _name>>"><<else>><div class="tribeinfo-img-placeholder"></div><</if>></div><div class="tribeinfo-rel" data-tip="How this tribe views your people. Higher relations improve trade and diplomacy; lower relations invite hostility."><span>Relations</span><<set _relClass = (_rel > 0) ? "rel-high" : ((_rel < 0) ? "rel-low" : "rel-mid")>><strong class="<<print _relClass>>"><<print _rel>></strong></div><div class="tribeinfo-traits"><div class="tribeinfo-traits-label">Traits</div><div class="tribeinfo-traits-list"><<if _t.traits and _t.traits.length>><<for _ti = 0; _ti < _t.traits.length; _ti++>><<set _trait = _t.traits[_ti]>><<print '<span class="tribeinfo-trait-badge" data-tip="' + (_trait.desc ?? '') + '">' + (_trait.name ?? _trait) + '</span>'>><</for>><<else>><span class="tribeinfo-trait-empty">None recorded</span><</if>></div></div></div><div class="tribeinfo-right"><div class="tribeinfo-leader"><div class="tribeinfo-leader-label">Leader</div><div class="tribeinfo-leader-body"><<if _t.leader>><div class="tribeinfo-leader-info"><div class="tribeinfo-leader-line"><span class="tribeinfo-leader-name"><<print _t.leader.name ?? "Unknown">></span><<if _t.leader.title>><span class="tribeinfo-leader-title"> - <<print _t.leader.title>></span><</if>></div></div><<if _t.leader.id>><div class="tribeinfo-leader-action"><span class="ti-btn-tip" data-tip="Leader profile"><<link "Info">><<set $activePersonId = _t.leader.id>><<set $personInfoId = _t.leader.id>><<set $personInfoTab = "friendly">><<set $personInfoReturnPassage = "Tribe_Info">><<goto "Person_Info">><</link>></span></div><</if>><<else>><div class="tribeinfo-leader-unknown">Unknown</div><</if>></div></div><div class="tribeinfo-meta"><div class="tribeinfo-line"><span class="k">Temperament</span><span class="v"><<print '<span class="tribeinfo-badge" data-tip="' + _tempTip + '">' + _temp + '</span>'>></span></div><div class="tribeinfo-line"><span class="k">Mood</span><span class="v"><<print '<span class="tribeinfo-badge" data-tip="' + _moodTip + '">' + _mood + '</span>'>></span></div></div><div class="tribeinfo-stats"><div class="tribeinfo-stat" data-tip="Estimated size of this tribe's population."><span class="k">Population</span><span class="v"><<print _pop>></span></div><div class="tribeinfo-stat" data-tip="Surplus goods and wealth this tribe holds. Affects trade value."><span class="k">Resources</span><span class="v"><<print _res>></span></div><div class="tribeinfo-stat" data-tip="How capable this tribe is in armed conflict."><span class="k">Mil Str</span><span class="v"><<print _mil>></span></div></div></div></div><div class="tribeinfo-actions"><div class="tribeinfo-tabs"><<if $tribeInfoTab is "friendly">><span class="tribeinfo-tab is-active" data-tip="Diplomatic and trade actions">Friendly</span><<link "Hostile">><<set $tribeInfoTab = "hostile">><<goto "Tribe_Info">><</link>><<else>><<link "Friendly">><<set $tribeInfoTab = "friendly">><<goto "Tribe_Info">><</link>><span class="tribeinfo-tab is-active" data-tip="Coercive and aggressive actions">Hostile</span><</if>></div><div class="tribeinfo-btnrow"><<if $tribeInfoTab is "friendly">><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Visit</span></span>'>><<elseif _visitUsed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _visitTip + '"><span class="macro-button disabled">Visit</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Visit this tribe and try to improve relations. Once per turn."><<button "Visit">><<goto "Tribe_Friendly_Visit">><</button>></span><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled is-wip">Knowledge Share</span></span>'>><<else>><span class="ti-btn-tip is-disabled" data-tip="Not yet implemented - check back in a future update."><span class="macro-button disabled is-wip">Knowledge Share</span></span><</if>><<if not _directAllowed>><<if _mishanTributary>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Break Tribute</span></span>'>><<else>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Bind Tribe</span></span>'>><</if>><<elseif setup.federation && setup.federation.isMember && setup.federation.isMember(_tid)>><span class="ti-btn-tip" data-tip="This tribe already stands inside your federation."><<button "Federation Member">><<goto "Federation">><</button>></span><<elseif _mishanTributary>><span class="ti-btn-tip" data-tip="Convince this tribe to stop acknowledging Mishan's demands before asking them to join your federation."><<button "Break Tribute">><<goto "Tribe_Friendly_BreakTribute">><</button>></span><<else>><span class="ti-btn-tip" data-tip="Ask this tribe to stand with you beneath a shared federation oath."><<button "Bind Tribe">><<goto "Tribe_Friendly_BindTribe">><</button>></span><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Peace Oath</span></span>'>><<elseif _peaceOathRemaining > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _peaceOathTip + '"><span class="macro-button disabled">Peace Oath</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Swear an eight-turn peace with this tribe if they accept the terms."><<button "Peace Oath">><<goto "Tribe_Friendly_PeaceOath">><</button>></span><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Trade</span></span>'>><<elseif _tradeUsed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _tradeTip + '"><span class="macro-button disabled">Trade</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Exchange goods with this tribe."><<button "Trade">><<goto "Tribe_Trade">><</button>></span><</if>><span class="ti-btn-tip" data-tip="Return to the tribes list."><<button "Return">><<goto "OtherTribes">><</button>></span><<else>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Force Migration</span></span>'>><<elseif _migrationCd > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _migrationTip + '"><span class="macro-button disabled">Force Migration</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Pressure this tribe into moving their camp to a new location."><<button "Force Migration">><<goto "Tribe_Hostile_ForceMigration">><</button>></span><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Tribute</span></span>'>><<elseif _peaceOathRemaining > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="Peace oath forbids tribute demands against this tribe for ' + _peaceOathRemaining + ' more turn' + (_peaceOathRemaining isnot 1 ? 's.' : '.') + '"><span class="macro-button disabled">Tribute</span></span>'>><<elseif _tributeCd > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _tributeTip + '"><span class="macro-button disabled">Tribute</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Demand resources from this tribe under threat of force."><<button "Tribute">><<goto "Tribe_Hostile_Tribute">><</button>></span><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Infiltrate</span></span>'>><<elseif _infiltrationReady>><span class="ti-btn-tip is-disabled" data-tip="Already infiltrated. Launch a raid against them to make use of it."><span class="macro-button disabled">Infiltrate</span></span><<elseif _hasGhostWalk and Number($belief ?? 0) >= _ghostWalkCost>><span class="ti-btn-tip" data-tip="Use Ghost Walk to slip into their camp undetected before a raid. Costs 5 Belief."><<button "Infiltrate">><<goto "Tribe_Hostile_Infiltrate">><</button>></span><<else>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _infiltrateNeedTip + '"><span class="macro-button disabled">Infiltrate</span></span>'>><</if>><<if not _directAllowed>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _directBlockTip + '"><span class="macro-button disabled">Raid</span></span>'>><<elseif _peaceOathRemaining > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="Peace oath forbids raiding this tribe for ' + _peaceOathRemaining + ' more turn' + (_peaceOathRemaining isnot 1 ? 's.' : '.') + '"><span class="macro-button disabled">Raid</span></span>'>><<elseif _raidBlock > 0>><<print '<span class="ti-btn-tip is-disabled" data-tip="' + _raidBlockTip + '"><span class="macro-button disabled">Raid</span></span>'>><<else>><span class="ti-btn-tip" data-tip="Launch a raid against this tribe."><<button "Raid">><<set $raidTargetId = _tid>><<set $raidV1 = null>><<goto "Raid_V1_Setup">><</button>></span><</if>><span class="ti-btn-tip" data-tip="Return to the tribes list."><<button "Return">><<goto "OtherTribes">><</button>></span><</if>></div></div><</if>></div></div><<silently>>
<<set _tid = setup.tribes.getActiveTribeId ? setup.tribes.getActiveTribeId() : $activeTribeId>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true, blockTip: "This tribe cannot be reached right now." }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockTip = _directAccess?.blockTip ?? "This tribe cannot be reached right now.">>
<<set _view = setup.dynamicQuests.getKnowledgeShareView(_tid)>>
<<set _result = $dynamicQuestShareResult>>
<</silently>>
''<div class="hub-textbox">
<h2>Knowledge Share</h2>
<<if _result and _result.ok>>
<p><<print _result.leadText>></p>
<p>A lead has been marked on the migration map. You have <b><<print _result.turns>> turns</b> before the trail grows cold.</p>
<div class="result-line good"><span class="label">Quest</span><span class="value"><<print _result.questName>></span></div>
<<if _result.spent>><div class="result-line bad"><span class="label">Cost</span><span class="value"><<print _result.spent>></span></div><</if>>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Tribe</span>">><<run setup.dynamicQuests.clearShareResult()>><<goto "Tribe_Info">><</button>>
</div>
<<elseif _result and not _result.ok>>
<p><<print _result.reason>></p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Tribe</span>">><<run setup.dynamicQuests.clearShareResult()>><<goto "Tribe_Info">><</button>>
</div>
<<elseif not _directAllowed>>
<p><<print _directBlockTip>></p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Tribe</span>">><<goto "Tribe_Info">><</button>>
</div>
<<elseif not _view.ok>>
<p>No tribe is close enough in memory or council to ask for useful local knowledge.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return</span>">><<goto "OtherTribes">><</button>>
</div>
<<elseif _view.blocked>>
<p>Your people are already following another shared lead. Let that trail end, fail, or grow cold before asking another tribe for knowledge.</p>
<div class="result-line"><span class="label">Current lead</span><span class="value"><<print _view.activeQuest.name ?? _view.activeQuest.title ?? "Shared Lead">></span></div>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Tribe</span>">><<goto "Tribe_Info">><</button>>
</div>
<<elseif _view.band is "bad">>
<p>The speakers of <<print _view.tribeName>> listen without warmth. They answer with old grievances, guarded eyes, and nothing useful about trails or abandoned stores.</p>
<p>Whatever they know, they will not spend it on you.</p>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Return to Tribe</span>">><<goto "Tribe_Info">><</button>>
</div>
<<elseif _view.band is "neutral">>
<p><<print _view.tribeName>> has old trail knowledge, but memory has value. They ask for goods before they name the place.</p>
<div class="result-line"><span class="label">Asked payment</span><span class="value"><<print _view.goodsCost>> Goods</span></div>
<div class="result-line"><span class="label">Sway cost</span><span class="value"><<print _view.swayCost>> Belief</span></div>
<div class="hub-buttons story-scroll-actions-inline">
<<if _view.hasGoods>>
<<button "<span class='choice-text'>Pay Goods</span><span class='choice-note'>-<<print _view.goodsCost>> Goods</span>">><<run setup.dynamicQuests.acceptKnowledgeShare(_tid, "pay")>><<goto "Tribe_KnowledgeShare">><</button>>
<<else>>
<span class="macro-button disabled" title="Not enough Goods."><span class="choice-text">Pay Goods</span><span class="choice-note">Need <<print _view.goodsCost>> Goods</span></span>
<</if>>
<<if _view.canSway>>
<<button "<span class='choice-text'>Use Sway</span><span class='choice-note'>-<<print _view.swayCost>> Belief</span>">><<run setup.dynamicQuests.acceptKnowledgeShare(_tid, "sway")>><<goto "Tribe_KnowledgeShare">><</button>>
<<else>>
<span class="macro-button disabled" title="<<print _view.swayDisabledReason>>"><span class="choice-text">Use Sway</span><span class="choice-note"><<print _view.swayDisabledReason>></span></span>
<</if>>
<<button "<span class='choice-text'>Return to Tribe</span>">><<goto "Tribe_Info">><</button>>
</div>
<<else>>
<p><<print _view.tribeName>> shares more freely. Their speakers name old baskets, wrapped hides, and tools left behind when their camp moved under pressure.</p>
<p>They ask no goods, but the request spends trust. This will cost <<print _view.relationCost>> relations with the tribe.</p>
<div class="result-line bad"><span class="label">Relations cost</span><span class="value">-<<print _view.relationCost>> Relations</span></div>
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Spend Relations</span><span class='choice-note'>-<<print _view.relationCost>> Relations</span>">><<run setup.dynamicQuests.acceptKnowledgeShare(_tid, "relations")>><<goto "Tribe_KnowledgeShare">><</button>>
<<button "<span class='choice-text'>Return to Tribe</span>">><<goto "Tribe_Info">><</button>>
</div>
<</if>>
</div><<silently>>
/* Init UI vars */
<<set $tradeOfferGoods = Number($tradeOfferGoods ?? 0)>>
<<set $tradeDemandRes = Number($tradeDemandRes ?? 0)>>
<<set $tradeResultHtml = $tradeResultHtml ?? "">>
/* Active tribe (guard for scratch/testing) */
<<set _t = (setup.trade && setup.trade.getActiveTribe) ? setup.trade.getActiveTribe() : null>>
<<set _tid = _t?.id ?? ((setup.trade && setup.trade.getActiveTribeId) ? setup.trade.getActiveTribeId() : ($activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId))>>
<<set _directAccess = (_tid && setup.map && setup.map.getTribeInteractionAccess) ? setup.map.getTribeInteractionAccess(_tid, { range: 2 }) : { canDirectInteract: true }>>
<<set _directAllowed = !!(_directAccess && (_directAccess.canDirectInteract ?? _directAccess.available))>>
<<set _directBlockLabel = _directAccess?.blockLabel ?? "Unavailable">>
<<set _directBlockTip = _directAccess?.blockTip ?? "This direct camp action is not available right now.">>
/* Player cap */
<<set _maxOffer = Math.max(0, Number($goods ?? 0))>>
/*
Dynamic tribe cap (passage-side fallback)
- based on tribe resources in stock
- improved by relations
- temperament affects willingness
*/
<<set _tribeRes = Math.max(0, Number(_t?.stats?.resources ?? 0))>>
<<set _rel = Number(_t?.relations ?? 0)>>
<<set _temp = (setup.tribes && setup.tribes.normalizeTemperament) ? setup.tribes.normalizeTemperament(_t?.temperament ?? "normal") : String(_t?.temperament ?? "normal")>>
/* willingness baseline */
<<set _baseFrac = 0.25>>
/* relations bonus: -50..+50 => -0.10..+0.15 */
<<set _relFrac = Math.max(-0.10, Math.min(0.15, _rel / 333.33))>>
/* temperament modifier */
<<set _tempFrac = (
_temp is "trader" ? 0.12 :
_temp is "opportunistic" ? 0.06 :
_temp is "honorable" ? 0.04 :
_temp is "cautious" ? -0.02 :
_temp is "cowardly" ? -0.06 :
_temp is "aggressive" ? -0.08 :
0
)>>
/* final fraction, clamped */
<<set _frac = Math.max(0.05, Math.min(0.60, _baseFrac + _relFrac + _tempFrac))>>
/* dynamic max demand */
<<set _maxDemand = Math.floor(_tribeRes * _frac)>>
/* Always allow at least 0, never above their stock */
<<set _maxDemand = Math.max(0, Math.min(_maxDemand, _tribeRes))>>
/* Safety clamps so UI never exceeds caps */
<<set $tradeOfferGoods = Math.max(0, Math.min($tradeOfferGoods, _maxOffer))>>
<<set $tradeDemandRes = Math.max(0, Math.min($tradeDemandRes, _maxDemand))>>
<</silently>>
<div class="trade-wrap trade-card">
<div class="trade-title">TRADE</div>
<div class="trade-subtitle">WORK IN PROGRESS</div>
<<if !(setup.trade && setup.trade.getActiveTribe)>>
<div class="trade-result">
Trade system not loaded (setup.trade is missing). If you're testing in a Scratch build, open the full story export instead.
</div>
<</if>>
<<if _t and not _directAllowed>>
<div class="trade-result">
<b><<print _directBlockLabel>></b><br>
<<print _directBlockTip>>
</div>
<</if>>
<div class="trade-head">
<div class="trade-head-item">OFFER</div>
<div class="trade-head-item">DEMAND</div>
</div>
<div class="trade-grid">
<div class="trade-panel">
<div class="trade-panel-title">GOODS</div>
<div class="trade-value"><<print $tradeOfferGoods>></div>
<div class="trade-stepper">
<<if $tradeOfferGoods > 0>>
<<button "-">>
<<set $tradeOfferGoods = Math.max(0, $tradeOfferGoods - 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">-</span>
<</if>>
<<if $tradeOfferGoods < _maxOffer>>
<<button "+">>
<<set $tradeOfferGoods = Math.min(_maxOffer, $tradeOfferGoods + 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">+</span>
<</if>>
</div>
<div class="trade-hint">
You have: <b><<print _maxOffer>></b> goods
</div>
</div>
<div class="trade-panel">
<div class="trade-panel-title">RESOURCES</div>
<div class="trade-value"><<print $tradeDemandRes>></div>
<div class="trade-stepper">
<<if $tradeDemandRes > 0>>
<<button "-">>
<<set $tradeDemandRes = Math.max(0, $tradeDemandRes - 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">-</span>
<</if>>
<<if $tradeDemandRes < _maxDemand>>
<<button "+">>
<<set $tradeDemandRes = Math.min(_maxDemand, $tradeDemandRes + 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">+</span>
<</if>>
</div>
<div class="trade-hint">
They will trade up to: <b><<print _maxDemand>></b> resources (this season)
</div>
</div>
</div>
<div class="trade-btnrow trade-confirm">
<<if not _directAllowed>>
<span class="macro-button disabled" title="<<print _directBlockTip>>">Confirm</span>
<<else>>
<<button "Confirm">>
<<if setup.trade && setup.trade.attemptTrade>>
<<set _r = setup.trade.attemptTrade($tradeOfferGoods, $tradeDemandRes)>>
<<if _r and _r.endTrade>>
<<set $tribeTradeLastTurn = $tribeTradeLastTurn ?? {}>>
<<set _turnNow = (setup.tribes && setup.tribes.getTurnNow) ? setup.tribes.getTurnNow() : Number($turn ?? 0)>>
<<if _t and _t.id>><<set $tribeTradeLastTurn[_t.id] = _turnNow>><</if>>
<<goto "Tribe_Info">>
<<else>>
<<goto "Tribe_Trade">>
<</if>>
<<else>>
<<set $tradeResultHtml = "<i>Trade system not loaded.</i>">>
<<goto "Tribe_Trade">>
<</if>>
<</button>>
<</if>>
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
<<if $tradeResultHtml>>
<div class="trade-result">
<<print $tradeResultHtml>>
</div>
<</if>>
</div><div class="hub-textbox tut-textbox">
<strong>Your first Aspect</strong><br><br>
Congratulations on adopting your first Aspect — a meaningful step for any would-be godling.<br><br>
Aspects are powerful boons that will help you define your domain as the game progresses. But such power never comes free; with each Aspect come certain <b>Responsibilities</b>.<br><br>
Be mindful of your <b>Aspect Mandates</b>, which appear on the <b>Quests</b> screen. Honour them and your divinity will deepen; neglect them and the cost will find you.
</div>
<div class="hub-buttons tut-buttons">
<<button "Understood">><<tutStop>><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Belief, Zeal, Stability</strong><br><br>
<b>Belief</b><br> A special resource used to unlock and use Powers, and to improve your base stats on the character screen. Spending Belief lowers it, so save it for important moments.
<br><br>
<b>Zeal</b> and <b>Stability</b><br> These reflect your tribe’s spiritual drive and internal cohesion.
<ul>
<li>Events and outcomes can raise or lower them.</li>
<li><b>Stability</b> affects which events can appear and it also affects population growth.</li>
<li><b>Zeal</b> affects how much Belief you gain or lose each turn.</li>
</ul>
You’ll often see big changes after major outcomes (victory, defeat, disasters).
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Resources">><</button>>
<<button "Next">><<tutOpen "Tut_Powers">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Welcome!</strong><br><br> Want a short guided tour before you start?
<br><br>
Quick note: you can always revisit this tutorial from the <b>?</b> help button and the <b>Help</b> section.
</div>
<div class="hub-buttons tut-buttons">
<<button "No — straight into the game">>
<<tutStop>>
<</button>>
<<button "Yes — teach me">>
<<tutOpen "Tut_Loop">>
<</button>>
</div><div class="hub-textbox tut-textbox">
<strong>The basic loop</strong><br><br>
Each turn is a season. Your job is to keep the tribe alive, grow stronger, and respond to threats and opportunities.<br><br>
<b>In practice you’ll usually:</b>
<ol>
<li><b>Pick a Season Plan</b> (your main focus for the turn).</li>
<li><b>Spend Action Points (Energy)</b> on key actions.</li>
<li><b>React to events</b> (trade, raids, encounters).</li>
<li><b>Check your report</b> and plan the next turn.</li>
</ol>
<b>Action Points (Energy):</b> you have a limited amount each turn, and it resets every turn.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Intro">><</button>>
<<button "Next">><<tutOpen "Tut_Stats">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>The Map, movement, and tiles</strong><br><br>
The world is a small grid map made of tiles. Your camp is always on exactly one tile.<br><br>
<b>What the map is used for:</b>
<ul>
<li><b>Quests and expeditions:</b> quests are tied to specific tiles. Some quests can appear on tiles next to your camp.</li>
<li><b>Discovery:</b> moving and scouting reveals what nearby tiles contain (resources, encounters, opportunities).</li>
<li><b>Other tribes:</b> you mainly discover other tribes by exploring tiles.</li>
</ul>
<b>Movement (simple rules):</b>
<ul>
<li>When you move, your camp changes to a new tile.</li>
<li>Being on a tile matters. Many quests and encounters only trigger if you are on the correct tile.</li>
</ul>
<b>Expeditions:</b><br> The <b>Expedition</b> button only appears when:
<ul>
<li>you have an <b>active</b> quest, and</li>
<li>your camp is standing on the quest’s <b>target tile</b>.</li>
</ul>
If you are not on the target tile, the button will not show up.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Powers">><</button>>
<<button "Next">><<tutOpen "Tut_Tribes">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Powers</strong><br><br>
Powers are rare, high-impact options that can appear during key moments (especially events).
<br><br>
<b>How they work:</b>
<ol>
<li>You must have the Power unlocked/owned.</li>
<li>You must have enough <b>Belief</b> to pay its cost.</li>
<li>If both are true, the Power appears as a clickable option.</li>
<li>If not, it may show as disabled with a tooltip.</li>
</ol>
<b>Example:</b> During a raid-defense prep you might see a Power option like <b>“Use the Spark (Belief)”</b> — but only if you own Spark and have enough Belief.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Belief">><</button>>
<<button "Next">><<tutOpen "Tut_Map">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Raid basics</strong><br><br>
<<if $raidCombatTutorialMode is "defense">>
You are defending the camp. Your preparation choice sets the tone before the clash starts, then your warbands try to hold the line until the raiders break or time runs out.
<<else>>
You are leading a raid. Your <b>Commitment</b> decides how many warbands you send, while your <b>Approach</b> shapes the opening pressure.
<</if>>
<br><br>
<ul>
<li>Each side fights across up to three lanes: <b>left</b>, <b>center</b>, and <b>right</b>.</li>
<li><b>HP</b> is how much punishment a warband can take. If HP reaches 0, it breaks.</li>
<li><b>Morale</b> is courage and discipline. If Morale reaches 0, it breaks even if some fighters remain.</li>
<li><b>ATK</b> helps a warband hurt or pressure the enemy. <b>DEF</b> helps it absorb damage and hold the lane.</li>
<li><b>Resolve</b> is an army's will to continue. A side breaks when its Resolve reaches 0.</li>
<li><b>Command Points (CP)</b> pay for orders. Most commands cost 1 CP, and unspent CP is discarded when you end the round.</li>
<li><b>Reserves</b> are warbands waiting outside the active fronts. You can deploy one into an open, empty lane for 1 CP.</li>
<li>The <b>Selected Lane</b> receives your next command. <b>Leader Focus</b> grants its listed bonus, while <b>Warband Focus</b> shows where that band will attack.</li>
<li><b>Push</b> is aggressive, <b>Hold</b> is steady, and <b>Rally</b> helps a battered lane recover.</li>
<li>Use <b>End Round</b> once you have issued the commands you want for that round.</li>
</ul>
That is enough to get started. Watch the lane panels and battle log, and you will pick up the rhythm quickly.
</div>
<div class="hub-buttons tut-buttons">
<<button "Understood">><<tutStop>><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Resources — Food, Resources, Goods, Population</strong><br><br>
These are your economy. Some change passively each turn, while others rise or fall through plans, actions, and events.
<br><br>
<b>Food</b><br> Used to feed your people each turn. Your camp gathers passive Food from Pops, tile <b>Game</b>, and the current Season. If you choose <b>Hunt Game</b>, it adds a separate hunting bonus. Then upkeep is paid.
<br><br>
<b>Resources</b><br> Basic materials (wood, stone, hides, etc.). Used for development and often lost in raids or disasters. A large stockpile gives a small bonus to Military strength.
<br><br>
<b>Goods</b><br> Higher-value trade items. They can raise your long-term Stability baseline. Useful for trade and diplomacy, but harder to get.
<br><br>
<b>Population (Pops)</b><br> Your tribe size. More pops usually means more upkeep, but also more output. Pops grow slowly over time and can also be lost to events (and starvation).
<br><br>
<b>Where they change:</b>
<ul>
<li><b>Season Plans</b> — push advantages, create surpluses, hunt extra food, or support growth and defense.</li>
<li><b>Events</b> — can give or take Food, Resources, Goods, and sometimes Pops.</li>
<li><b>Trade</b> — often converts Resources into Food and/or Goods (sometimes Pops).</li>
<li><b>Raids</b> — can cost resources if you fail, retreat, or get counterattacked.</li>
<li><b>End of turn</b> — food is gathered, Food upkeep is paid, pop growth is applied, and the Report shows the breakdown.</li>
</ul>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Stats">><</button>>
<<button "Next">><<tutOpen "Tut_Belief">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Stats — what they are</strong><br><br>
Stats are your main capabilities. They are used in events, actions, and dialogue checks.<br><br>
<b>Core stats:</b>
<ul>
<li><b>Wisdom</b> — insight and planning.</li>
<li><b>Strength</b> — raw power and fighting.</li>
<li><b>Endurance</b> — toughness and survival.</li>
<li><b>Leadership</b> — command and coordination. Helps in conflicts and can improve your tribe's military strength.</li>
<li><b>Charisma</b> — persuasion and social influence.</li>
<li><b>Stewardship</b> — logistics and efficiency. Can reduce food upkeep and help with planning or trade.</li>
</ul>
<b>How checks work:</b><br> Most checks roll <b>Stat + d20</b> against a <b>DC</b> (difficulty). Bonuses or penalties can come from relationships, traits, and your tribe’s current situation (like military strength).
<br><br>
<b>Examples:</b>
<ul>
<li>Trade often uses <b>Stewardship</b> or <b>Charisma</b>.</li>
<li>Raids can use <b>Leadership</b> and <b>Strength</b>. Later, some fights use combined values (example: <b>Strength + Endurance + Mil</b>).</li>
</ul>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Loop">><</button>>
<<button "Next">><<tutOpen "Tut_Resources">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Good to know</strong><br><br>
<b>1) Read the outcome lines.</b><br> Many events clearly show the exact check you rolled and what you gained/lost.
<br><br>
<b>2) Quests are location-based.</b><br> If a quest exists, moving to the target tile is often the key step — then <b>Expedition</b> becomes available.
<br><br>
<b>3) There is a long-term goal.</b><br> A victory condition can track rival tribes resolved in the region, whether they are defeated by force or permanently federated later.
<br><br>
And remember: you can revisit this any time from the <b>?</b> help menu. Good luck godling! May the winds of fate favour you!
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Tribes">><</button>>
<<button "Finish">><<tutStop>><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Finding other tribes</strong><br><br>
Other tribes exist on the map as camps. The goal is to <b>find them</b>, <b>make contact</b>, then decide your relationship: trade, diplomacy, intimidation, or war.
<br><br>
<b>Step 1 — Discover a tribe (find their camp):</b>
<ul>
<li><b>Scout / explore</b> to reveal tiles until you see a tribe camp icon on the map.</li>
<li>You can also use <b>Seek other tribes</b>. This attempts contact with tribes in a <b>5x5 area</b> around your camp.
<ul>
<li><b>Closer tribes</b> are easier to reach.</li>
<li>If no tribe is in range, nothing happens.</li>
</ul>
</li>
</ul>
<b>Step 2 — Make contact (so they show up in the list):</b><br> A tribe only appears in <b>Other Tribes</b> after you have made <b>real contact</b> with them (not just seeing the icon).
<br><br>
<b>Step 3 — Use the Other Tribes screen:</b>
<ul>
<li><b>Info</b> shows what you know: their status, temperament, mood, and useful notes.</li>
<li><b>Visit</b> and diplomacy options are how you interact directly when they are available.</li>
<li><b>Trade</b> lets you exchange resources.</li>
<li>Hostile actions like tribute, infiltration, and <b>Raid</b> can start conflicts and carry risk.</li>
</ul>
<b>Temperament (how they react):</b>
<ul>
<li>Each tribe has a temperament that influences how they respond to you.</li>
<li>Some tribes are easier to trade with, others respect strength, and some hold grudges.</li>
<li>Temperament affects options, outcomes, and how quickly relations improve or worsen.</li>
</ul>
<b>Other tribes and Season Plans:</b>
<ul>
<li>Other tribes run their own plans and economy in the background.</li>
<li>Their plan can change what they offer (or demand) in trade.</li>
<li>Some plans make them more defensive or aggressive for a time.</li>
<li>If you keep contact, you will sometimes notice changes in their behavior, rumors, and options.</li>
</ul>
<b>Important:</b> the tribe list focuses on tribes you’ve actually contacted. Active quest targets can also appear there while the obligation lasts.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Map">><</button>>
<<button "Next">><<tutOpen "Tut_Tips">><</button>>
</div>\:: UI_Bindings [widget]
<<widget "refreshSidebarUnlocks">>
<<script>>
(function () {
const u = (State.variables.uiUnlocks || {});
u.laws = true;
State.variables.uiUnlocks = u;
const buttons = [
{ id: "btn-character", key: "character", passage: "Character" },
{ id: "btn-inventory", key: "inventory", passage: "Inventory" },
{ id: "btn-relationships", key: "relationships", passage: "Relationships" },
{ id: "btn-quests", key: "quests", passage: "Quests" },
{ id: "btn-faith", key: "faith", passage: "Faith" },
{ id: "btn-diplomacy", key: "diplomacy", passage: "Federation" },
{ id: "btn-laws", key: "laws", passage: "Traditions" },
{ id: "btn-map", key: "map", passage: "Map" },
// NEW: mode switch buttons (give them IDs in your HTML)
{ id: "mode-switch-status", key: "modeSwitch", action: "switch", target: "civ" },
{ id: "mode-switch-civ", key: "modeSwitch", action: "switch", target: "status" }
];
buttons.forEach(b => {
const el = document.getElementById(b.id);
if (!el) return;
// Disable based on unlock flag. Relationships is a passive tracker menu, so it stays available.
const isAvailable = b.key === "relationships" ? true : !!u[b.key];
const turnFlowLocked = !!(setup.ui && setup.ui.isTurnFlowLocked && setup.ui.isTurnFlowLocked());
el.disabled = !isAvailable || turnFlowLocked;
el.onclick = function () {
const uu = State.variables.uiUnlocks || {};
if (setup.ui && setup.ui.isTurnFlowLocked && setup.ui.isTurnFlowLocked()) return;
if (b.key !== "relationships" && !uu[b.key]) return;
if (b.action === "switch") {
// switch panel by setting active class
const panels = document.querySelectorAll("#sidebar .sidebar-panel");
panels.forEach(p => p.classList.remove("active"));
const tgt = document.querySelector('#sidebar .sidebar-panel[data-panel="' + b.target + '"]');
if (tgt) tgt.classList.add("active");
return;
}
// normal passage buttons
Engine.play(b.passage);
};
});
if (setup.ui && setup.ui.applyTurnFlowLock) setup.ui.applyTurnFlowLock(State.passage);
})();
<</script>>
<</widget>><div class="intro-creation intro-start-form vessel-creation no-click-sfx">
<<silently>>
<<run setup.traits && setup.traits.ensureState ? setup.traits.ensureState() : null>>
<<if !$vesselStability>><<run setup.traits.setVessel("marked")>><</if>>
<</silently>>
<p class="vessel-lead">The question echoes through the void, and the void answers with fragments. A body. A face. A name. Not fully remembered, not fully chosen. A vessel taking form around the thing that calls itself you.</p>
<div class="vessel-form-grid">
<label><span>Name</span><<textbox "$user" "">></label>
<label><span>Hair</span><<listbox "$hair" autoselect>>
<<option "Blonde">>
<<option "Black">>
<<option "White">>
<<option "Brown">>
<<option "Ginger">>
<</listbox>></label>
<label><span>Eyes</span><<listbox "$eyes" autoselect>>
<<option "Blue">>
<<option "Red">>
<<option "Green">>
<<option "Hazel">>
<<option "Brown">>
<</listbox>></label>
<label><span>Skin</span><<listbox "$skin" autoselect>>
<<option "Pale">>
<<option "Beige">>
<<option "Olive">>
<<option "Ebony">>
<</listbox>></label>
<label><span>Height</span><<numberbox "$height" "175">></label>
</div>
<<nobr>><<print setup.traits.renderVesselChoicePanel()>><<print setup.traits.renderCreationPanel()>><</nobr>>
<<button "CONFIRM VESSEL">>
<<run setup.traits.ensureState()>>
<<set $user = setup.normalizeCharacterName($user)>>
<<set $height = Math.max(120, Math.min(280, Math.round(Number($height ?? 175) || 175)))>>
<<if $user.trim() !== "" && $hair.trim() !== "" && $eyes.trim() !== "" && $skin.trim() !== "" && setup.traits.validateSelection().ok>>
<<goto "CONFIRM">>
<<else>>
<<script>>
var check = setup.traits.validateSelection();
Dialog.setup("The vessel will not hold...");
Dialog.wiki(check.message || Story.get("MustRemember").processText());
Dialog.open();
<</script>>
<</if>>
<</button>>
</div>''<div class="intro-creation no-click-sfx intro-void-story">
The question does not remain yours for long.
Other presences stir in the dark. You do not know whether they have only just awakened, or whether you have only just noticed them.
Not voices. Not bodies. Sparks, perhaps. Small points of awareness scattered through the void, frightened and searching, each one newly awake. For a moment, you feel them as clearly as you feel yourself: their confusion, their reaching, their refusal to vanish.
You reach back.
There is contact.
Brief. Bright. Almost painful.
A shared breath without lungs.
Then the void tears open.
And you fall as nothing consumes you.
<<button "As everything goes dark.">>
<<goto "though you have never seen it before.">>
<</button>>
</div>''<<silently>>
<<set $introEarlyChoice = "">>
<<set $introLateChoice = "">>
<<set $pops = random(20, 25) + ((setup.traits && setup.traits.has && setup.traits.has("favored_beginning")) ? 10 : 0)>>
<</silently>>
<<run setup.playNamedTrackFadeIn ? setup.playNamedTrackFadeIn("stars", {
durationMs: 2400,
targetVolume: (((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.72),
stopAll: false,
source: "intro"
}) : null>>
''<div class="intro-grounded intro-prologue-shell no-click-sfx">
As your eyes open, slowly at first, strange figures gather at the edge of your vision.
Then the world sharpens.
The source of the poking reveals itself: a small human, fair-haired and crouched beside you, with a stick held loosely in one hand. Behind him, more figures come into focus. Adults. Children. Hunters. Watchers. All of them curious, though not all of them brave enough to stand as close as he does.
Your eyes snap fully open.
Fear grips you.
Not rational fear. Not thought. Instinct.
Human instinct.
You lurch upright to your full height, and the sudden movement sends alarm through the gathered people. Spears rise. Feet scrape back through dirt and grass. Hands reach for tools that can become weapons.
Only the boy remains where he is.
Calm. Watching. Still holding his stick.
The people who found you are human too.
<<if $height > 220>>
<<set $strength += 2>>
Your size unsettles them at once. A few stumble back. Someone drops a tool. Mothers pull children behind them. Only the bravest hunters remain close enough to keep their spears pointed at the towering stranger before them.
<<elseif $height > 190>>
<<set $strength += 1>>
They do not flee, but they keep their distance. Necks tilt upward when you stand. Spears lower only slowly. Some make warding gestures.
<<elseif $height < 160>>
They are larger than you. Some look down with pity, others with suspicion, as if your small frame makes you both less threatening and more fragile.
<<else>>
They study you with careful curiosity, a hard silence settling in as they try to decide whether you are danger, burden, or blessing.
<</if>>
You do not know what to do. Several instincts fight for control at once. One tells you to run. One tells you to strike. One tells you to bare your teeth and make yourself too dangerous to approach.
Before any of them can take hold, the boy moves.
He steps between you and the nearest spear.
A woman hisses something sharp behind him, but he does not look back. He only lowers his stick, slowly, and lays it on the ground between you.
Then he raises both hands.
Empty.
The gesture is small. Foolish.
But the others see it. Spears remain pointed your way, but they stop advancing. The hard panic in the air loosens, little by little, until fear becomes caution instead.
<div class="hub-buttons">
<<button "Continue">>
<<goto "Intro_TribeOffer">>
<</button>>
</div>
</div>''''<div class="intro-grounded intro-prologue-shell no-click-sfx">
Children born beneath your watch become hunters, then parents themselves.
<<if $introLateChoice is "bloodline">>
Many carry your blood. In time, even they begin to look older than you.
<</if>>
Kael, the boy who found you in the wilderness, is a man now. His own child is on the way, and among the tribe, many already look to him as his father's heir.
At first, there is worry. Superstition. Whispered fear around low fires.
But Kael stands beside you, plain and steady as ever, and your place in the tribe has become too deep to tear out easily. In time, fear settles into something else.
When disputes threaten to split families, your word ends them. When enemies come near, you stand at the front. When food runs low, eyes turn to you before anyone else.
Then, after so many years, the man who taught you to speak, to hunt, and to belong takes his last breath.
The chieftain is dead.
The tribe mourns him.
For a time, nothing else matters.
But mourning cannot last forever. Soon, the question comes, quiet at first, then louder with every passing day.
Who will lead?
Most assume the answer is Kael. The late chieftain's son. The boy who found you. The man who has stood beside you since your eyes first opened.
Perhaps even you assume it.
Then Kael answers before the tribe can ask.
<div class="dialogue-inset">
<span class="dialogue-speaker">Kael</span>
<span class="dialogue-line">$user will be the new chieftain.</span>
</div>
He says it plainly, as he says most things.
There is no grand ceremony when leadership changes hands.
Only a dead man's fire burning low, a tribe waiting in silence, and Kael stepping aside.
You are named chieftain.
After that, the stories grow.
Around the fire, each one tries to explain what you are. No answer lasts for long.
But belief has begun to take shape.
<<silently>>
<<set $stability = 5>>
<<set $zeal = 10>>
<</silently>>
<div class="hub-buttons">
<<button "But what will that shape be?">>
<<goto "Migration_Pressure">>
<</button>>
</div>
</div>''<<silently>>
/* Ensure flags exist */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
<</silently>>
''<div class="hub-textbox">
<p>Morning comes quietly.</p>
<p>Mist hangs low over the camp, pale and thin, retreating as the fires are stirred back to life. Most of your people are only beginning to wake. Footsteps are soft, voices muted, the camp settling into the ordinary rhythm of another day.</p>
<p>The woman is still alive.</p>
<p>She lies near the edge of the firelight beneath borrowed hides. Her wound has been cleaned as well as it can be and packed with herbs before being bound tight. Blood still seeps through the dressing, but the flow has slowed.</p>
<p>At some point, her eyes open.</p>
<p>Her first breath is sharp and sudden. Her whole body tenses as though expecting hands already on her, muscles drawing tight before she has even understood where she is.</p>
<p>Then she sees you.</p>
<p>She freezes.</p>
<p>For a long moment she says nothing. Her gaze moves past you, taking in the fire, the shapes of your people, and the unfamiliar camp beyond. No panic follows, at least not outwardly. Eventually she lets out a slow, controlled breath.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“You didn't kill me.”</span></div>
<p>It is not a question. She studies you for another moment, then inclines her head slightly.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Thank you.”</span></div>
<p>The words sound rough, as though gratitude is not something she is accustomed to giving. She does not linger on it.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“My brother is alive. I would feel it if he were dead.”</span></div>
<p>The certainty in her voice hardens as she speaks.</p>
<div class="dialogue-inset"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“They'll find him. Soon. Maybe they already have. He can't outrun hunters while he's wounded and alone.”</span></div>
<p>Her fingers tighten around the hides beneath her until her knuckles pale.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“I won't beg. But I will ask.”</span></div>
<p>She shifts despite the pain, forcing herself more upright, and meets your eyes without looking away.</p>
<div class="dialogue-inset dialogue-inset--brief"><span class="dialogue-speaker">The Outcast</span><span class="dialogue-line">“Help me save him.”</span></div>
<p>She watches you closely after that. Whatever hope she has placed in your answer is kept behind a guarded expression, but not hidden well enough to miss.</p>
</div>''
<div class="hub-buttons">
<<button "Agree to help her">>
<<set $outcastMorningChoice = "help">>
<<goto "Event_meeting_brother_accept">>
<</button>>
<<button "Refuse">>
<<set $outcastMorningChoice = "refuse">>
<<goto "Event_meeting_brother_refuse">>
<</button>>
</div><div class="age-transition no-click-sfx">
<<set $CurrentAge = "Early Tribal">>
<<run setup.menuTheme && setup.menuTheme.set(1)>>
<<run setup.map.ensureCampSpawned()>>
<<run setup.map.randomizeTileYieldsOnce()>>
<<run setup.map.setPlayerSpawnTileBaseline()>>
<<silently>>
<<if !$uiUnlocks>><<set $uiUnlocks = {}>><</if>>
<<set $uiUnlocks.map = true>>
<<set $uiUnlocks.quests = true>>
<<set $uiUnlocks.character = true>>
<<set $uiUnlocks.inventory = true>>
<<set $uiUnlocks.relationships = false>>
<<set $uiUnlocks.modeSwitch = true>>
<<refreshSidebarUnlocks>>
<</silently>>
<div class="age-transition-shell">
<div class="age-transition-card">
<div class="age-transition-kicker">Age I</div>
<div class="age-transition-title">A New World</div>
<div class="age-transition-copy">The camp already breathes around you as if you had always stood at its center. Fires, hunger, worship, and want now gather beneath your shadow.</div>
<div class="age-transition-rule"></div>
<div class="age-transition-meta">
<span>Camp Awakened</span>
<span>Map Revealed</span>
<span>Season Begins</span>
</div>
<div class="age-transition-actions">
<<button "<span class='label'>Enter the camp</span><span class='sub'>Begin the first season</span>">>
<<set $tutorialOnboardingActive = true>>
<<set $tutorialMode = null>>
<<set $tutorialStage = "choice">>
<<set $prologueStage = "opening">>
<<set $hubSceneView = "tent">>
<<goto "Hub_1">>
<</button>>
</div>
<div class="age-transition-footer">The first fire is lit. The rest is yours to shape.</div>
</div>
</div>
<div class="menu-card">
<div class="menu-title">
AGE I — A NEW WORLD
</div>
<div class="menu-actions">
<<link "CONTINUE">>
<<set $tutorialOnboardingActive = true>>
<<set $tutorialMode = null>>
<<set $tutorialStage = "choice">>
<<set $prologueStage = "opening">>
<<set $hubSceneView = "tent">>
<<goto "Hub_1">>
<</link>>
</div>
</div>
</div><<run setup.stopAllAudio ? setup.stopAllAudio() : null>>
''<div class="intro-grounded intro-prologue-shell no-click-sfx">
Darkness.
Then sound.
Small creatures chirp all around you, unseen and unfamiliar. Leaves whisper above. Something moves nearby, light-footed and cautious.
Then smell.
Damp earth. Crushed grass. Warm skin. Old smoke. Sweetness, rot, and a hundred other things your mind has no names for yet.
Then sensation.
Air against your skin. Weight beneath your back. A body around you, heavy and strange, answering slowly when you try to move.
Something pokes your head.
Again.
More insistently this time.
And finally, when all these things have dragged you close enough to waking, the last sense arrives.
Your eyes open.
<div class="hub-buttons">
<<button "Sight">>
<<goto "Your journey begins">>
<</button>>
</div>
</div>''\:: widget[widget]
/* ======================================================
QUEST LOCATION CHECK
====================================================== */
<<widget "questAtPlayer">>
<<set $questsHere = setup.quests && setup.quests.getCurrentExpeditions ? setup.quests.getCurrentExpeditions() : []>>
<<set $questHere = $questsHere.length ? $questsHere[0] : null>>
<</widget>>
/* ======================================================
QUEST TRACK TOGGLE (MULTI-TRACK + UNTRACK) - AUTO UPDATE
====================================================== */
<<widget "QuestTrackToggleButton">>
<<nobr>>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if !$untrackedQuestIds>><<set $untrackedQuestIds = []>><</if>>
/* Find quest name by id (so passage can call us with just id) */
<<set _qname = "Quest">>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qname = $quests[_i].name ?? _qname>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _tracked = ($trackedQuestIds.indexOf(_qid) >= 0)>>
<<capture _qid _qname>>
<<if _tracked>><<link "Hide Marker">>
/* Remove from tracked */
<<set _tmpT = []>>
<<for _t = 0; _t < $trackedQuestIds.length; _t++>>
<<set _curT = String($trackedQuestIds[_t])>>
<<if _curT is not _qid>>
<<set _tmpT.push(_curT)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _tmpT>>
/* Add to untracked */
<<if $untrackedQuestIds.indexOf(_qid) is -1>>
<<set $untrackedQuestIds.push(_qid)>>
<</if>>
/* Toast */
<<set $questsToastText = "Map marker hidden: " + _qname>>
<<run $(".quests-toast").text(State.variables.questsToastText || "")>>
<<run $("#quests-tracked-count").text((State.variables.trackedQuestIds?.length ?? 0) + " tracked")>>
/* Force map redraw (try common hooks safely) */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
/* Re-render just this button label/state */
<<run $("#qtbtn-" + _qid + " .qtbtn-body").first().empty().wiki('<<QuestTrackToggleButton "' + _qid + '">>')>>
<<run $("#quest-track-state-" + _qid).empty().wiki('<<QuestTrackedStateTag "' + _qid + '">>')>>
<</link>><<else>><<link "Track Marker">>
/* Add to tracked */
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Remove from untracked */
<<set _tmpU = []>>
<<for _u = 0; _u < $untrackedQuestIds.length; _u++>>
<<set _curU = String($untrackedQuestIds[_u])>>
<<if _curU is not _qid>>
<<set _tmpU.push(_curU)>>
<</if>>
<</for>>
<<set $untrackedQuestIds = _tmpU>>
/* Toast */
<<set $questsToastText = "Map marker tracked: " + _qname>>
<<run $(".quests-toast").text(State.variables.questsToastText || "")>>
<<run $("#quests-tracked-count").text((State.variables.trackedQuestIds?.length ?? 0) + " tracked")>>
/* Force map redraw (try common hooks safely) */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
/* Re-render just this button label/state */
<<run $("#qtbtn-" + _qid + " .qtbtn-body").first().empty().wiki('<<QuestTrackToggleButton "' + _qid + '">>')>>
<<run $("#quest-track-state-" + _qid).empty().wiki('<<QuestTrackedStateTag "' + _qid + '">>')>>
<</link>><</if>>
<</capture>>
<</nobr>>
<</widget>>
<<widget "QuestTrackedStateTag">>
<<nobr>>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if ($trackedQuestIds.indexOf(_qid) >= 0)>>
<span class="quest-tag quest-tag-track">Tracked</span>
<<else>>
<span class="quest-tag quest-tag-dim">Untracked</span>
<</if>>
<</nobr>>
<</widget>>
<<widget "QuestTrackToggle">>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<span @id="'qtbtn-' + _qid"><span class="qtbtn-body"><<QuestTrackToggleButton _qid>></span></span>
<</widget>>
/* ======================================================
EXPEDITION BUTTON
====================================================== */
<<widget "expeditionButton">>
<<questAtPlayer>>
<span data-tutorial-target="expedition">
<<if $questsHere.length and setup.quests.canUseExpeditionButton()>>
<<if $questsHere.length is 1>>
<<set _expeditionId = setup.quests.getQuestId($questsHere[0])>>
<<capture _expeditionId>><<button "Expedition">>
<<run setup.quests.launchExpeditionById(_expeditionId)>>
<</button>><</capture>>
<<else>>
<<button "Expedition">>
<<run setup.quests.openExpeditionSelector()>>
<</button>>
<</if>>
<<else>>
<button class="hub-disabled expedition-disabled" disabled>
Expedition
</button>
<</if>>
</span>
<</widget>>
/* ======================================================
CAMP NPC MANAGEMENT
====================================================== */
/* Add NPC to camp
Usage:
<<addCampNpc
"npc_id"
"Display Name"
"PassageName"
"Optional short desc"
"Optional image path"
>>
*/
<<widget "addCampNpc">>
<<set _id = $args[0]>>
<<set _name = $args[1]>>
<<set _pass = $args[2]>>
<<set _desc = $args[3] ?? "">>
<<set _img = $args[4] ?? "">>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
/* find existing entry (if any) */
<<set _idx = -1>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is _id>>
<<set _idx = _i>>
<<break>>
<</if>>
<</for>>
<<if _idx is -1>>
/* new entry */
<<set $campNpcs.push({
id: _id,
name: _name,
passage: _pass,
desc: _desc,
img: _img
})>>
<<else>>
/* update existing entry */
<<set $campNpcs[_idx].name = _name>>
<<set $campNpcs[_idx].passage = _pass>>
<<set $campNpcs[_idx].desc = _desc>>
<<if _img and _img.trim()>>
<<set $campNpcs[_idx].img = _img>>
<</if>>
<</if>>
<</widget>>
/* ======================================================
NPC TALK: check + once-per-turn
====================================================== */
/* Usage:
<<npcCheck "npc_id" "charisma" 15>>
- auto-success if max(affection, obedience) >= 50
- otherwise rolls d20 and compares:
total = stat + roll
dc = baseDC - floor(max(aff,obed)/10)
Writes a green/red result line.
Stores:
$npcLastCheck = { ok, statKey, stat, roll, dc, relMod, total }
*/
<<widget "npcCheck">>
<<set _id = $args[0]>>
<<set _statK = $args[1]>>
<<set _baseDC = Number($args[2] ?? 15)>>
<<set _silent = ($args[3] is "silent")>>
<<set _autoTh = Number($args[4] ?? 50)>>
<<set _context = String($args[5] ?? "talk")>>
<<silently>>
/* locate person by id */
<<set _p = null>>
<<if $people and $people.length and _id>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _id>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _obed = Number(_p ? (_p.obedience ?? _p.influence ?? 0) : 0)>>
/* affection: Love if female, else Trust */
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if _isFemale>>
<<set _affLabel = "Love">>
<<set _aff = Number(_p ? (_p.love ?? _p.trust ?? 0) : 0)>>
<<else>>
<<set _affLabel = "Trust">>
<<set _aff = Number(_p ? (_p.trust ?? 0) : 0)>>
<</if>>
<<set _rel = Math.max(_aff, _obed)>>
/* Auto-success threshold (param) */
<<set _auto = (_rel >= _autoTh)>>
/* roll */
<<set _roll = random(1, 20)>>
<<set _stat = setup.player.getStatForCheck(_statK)>>
/* DC adjustment: higher relationship makes it easier */
<<set _relMod = Math.floor(_rel / 10)>>
<<set _effectDcMod = Number(setup.effects && setup.effects.getInteractionDcModifier ? setup.effects.getInteractionDcModifier("campFollower") : 0)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _effectDcMod)>>
<<if setup.traits and setup.traits.applyDreadDc>><<set _dc = setup.traits.applyDreadDc(_dc, _context)>><</if>>
<<if setup.flaws and setup.flaws.applyCheckDcModifiers>><<set _dc = setup.flaws.applyCheckDcModifiers(_dc, _statK, _context)>><</if>>
<<set _total = _auto ? (_stat + 20) : (_stat + _roll)>>
<<set _ok = _auto or (_total >= _dc)>>
<<if !_ok and setup.flaws and setup.flaws.recordFailedStatCheck>><<run setup.flaws.recordFailedStatCheck(_statK, _context)>><</if>>
<<set $npcLastCheck = {
ok: _ok,
statKey: _statK,
stat: _stat,
roll: _roll,
dcBase: _baseDC,
dc: _dc,
rel: _rel,
relMod: _relMod,
effectDcMod: _effectDcMod,
autoThreshold: _autoTh,
auto: _auto,
total: _total,
affLabel: _affLabel,
aff: _aff,
obedience: _obed
}>>
<</silently>>
<<if !_silent>>
<<if $npcLastCheck.ok>>
<div class="npc-check npc-check-ok">
Check: (<<print $npcLastCheck.statKey>> <<print $npcLastCheck.stat>> + d20 <<print $npcLastCheck.roll>>)
= <<print $npcLastCheck.total>>
vs DC (<<print $npcLastCheck.dcBase>> - floor(max(Love/Trust,Obed)/10)=<<print $npcLastCheck.relMod>>)
= <<print $npcLastCheck.dc>>.
<b><<print $npcLastCheck.auto ? "AUTO SUCCESS!" : "Success!">></b>
</div>
<<else>>
<div class="npc-check npc-check-bad">
Check: (<<print $npcLastCheck.statKey>> <<print $npcLastCheck.stat>> + d20 <<print $npcLastCheck.roll>>)
= <<print $npcLastCheck.total>>
vs DC (<<print $npcLastCheck.dcBase>> - floor(max(Love/Trust,Obed)/10)=<<print $npcLastCheck.relMod>>)
= <<print $npcLastCheck.dc>>.
<b>Fail!</b>
</div>
<</if>>
<</if>>
<</widget>>
/* Usage:
<<npcOncePerTurn "npc_id" "compliment">>
Sets:
_canUse = true/false (temporary var)
*/
<<widget "npcOncePerTurn">>
<<set _id = $args[0]>>
<<set _key = $args[1]>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_id]>><<set $npcOncePerTurn[_id] = {}>><</if>>
<<set _usedTurn = $npcOncePerTurn[_id][_key] ?? -999>>
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _canUse = (_usedTurn != _turnNow)>>
<</widget>>
<<widget "npcPrintLastCheck">>
<<if $npcLastCheck and $npcLastCheck.ok>>
<div class="npc-check npc-check-ok">
Stat check… <<print $npcLastCheck.statKey>> vs DC <<print $npcLastCheck.dc>>…
roll: <<print $npcLastCheck.roll>>. <b>Success!</b>
</div>
<<elseif $npcLastCheck>>
<div class="npc-check npc-check-bad">
Stat check… <<print $npcLastCheck.statKey>> vs DC <<print $npcLastCheck.dc>>…
roll: <<print $npcLastCheck.roll>>. <b>Fail!</b>
</div>
<</if>>
<</widget>>
<<widget "npcTalkStoreResult">>
<<set _tag = $args[0] ?? "Check">>
<<set _okText = $args[1] ?? "They hear you out.">>
<<set _badText = $args[2] ?? "The exchange closes down.">>
<<set _tone = ($npcLastCheck and $npcLastCheck.ok) ? "ok" : "bad">>
<<set _word = ($npcLastCheck and $npcLastCheck.ok) ? "SUCCESS" : "FAIL">>
<<set _body = ($npcLastCheck and $npcLastCheck.ok) ? _okText : _badText>>
<<set _statName = $npcLastCheck ? String($npcLastCheck.statKey ?? "stat").toUpperCase() : "STAT">>
<<set _total = $npcLastCheck ? Number($npcLastCheck.total ?? 0) : 0>>
<<set _dc = $npcLastCheck ? Number($npcLastCheck.dc ?? 0) : 0>>
<<set _prefix = ($npcLastCheck and $npcLastCheck.auto) ? "AUTO " : "">>
<<set $npcTalkOutput =
"<div class='talk-result talk-result--" + _tone + "'>" +
"<span class='talk-result-tag'>" + _tag + "</span>" +
"<span class='talk-result-roll'>" + _prefix + _word + " " + _statName + " " + _total + " / DC " + _dc + "</span>" +
"</div>" +
"<div class='npc-answer'>" + _body + "</div>"
>>
<</widget>>
<<widget "npcTalkStoreNote">>
<<set _tag = $args[0] ?? "Conversation">>
<<set _body = $args[1] ?? "">>
<<set _tone = $args[2] ?? "neutral">>
<<set $npcTalkOutput =
"<div class='talk-result talk-result--" + _tone + "'>" +
"<span class='talk-result-tag'>" + _tag + "</span>" +
"<span class='talk-result-roll'>NOTE</span>" +
"</div>" +
"<div class='npc-answer'>" + _body + "</div>"
>>
<</widget>>
<<widget "npcTalkUnified">>
<<silently>>
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !_p>>
<<goto "Interact">>
<</if>>
<<set _id = _p.id ?? _pid>>
<<set _here = "Talk_1">>
<<if !$npcTalkMenu>><<set $npcTalkMenu = {}>><</if>>
<<if !$npcTalkOutput>><<set $npcTalkOutput = "">><</if>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_id]>><<set $npcOncePerTurn[_id] = {}>><</if>>
<<if !$npcKnownNames>><<set $npcKnownNames = {}>><</if>>
<<if !$npcRevealedName>><<set $npcRevealedName = {}>><</if>>
<<if !$npcTalkMenu[_id]>>
<<set $npcTalkMenu[_id] = "root">>
<<set $npcTalkOutput = "">>
<<npcTalk _id>>
<</if>>
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _visits = Number($npcTalks and $npcTalks[_id] ? $npcTalks[_id] : 1)>>
<<set _isFemale = ((_p.gender ?? "male") is "female") or (_p and _p.isFemale is true)>>
<<set _bondKey = _isFemale ? "love" : "trust">>
<<set _bondLabel = _isFemale ? "Love" : "Trust">>
<<set _bond = _isFemale ? Number(_p.love ?? _p.trust ?? 0) : Number(_p.trust ?? 0)>>
<<set _obed = Number(_p.obedience ?? _p.influence ?? 0)>>
<<set _role = String(_p.role ?? "Camp NPC").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/_/g, " ")>>
<<if String(_role).toLowerCase() is "camp npc">><<set _role = "Camp NPC">><</if>>
<<set _name = _p.name ?? "Unknown">>
<<if _id is "npc_outcast">><<set _name = "Outcast">><</if>>
<<if _id is "npc_outcast_brother">><<set _name = "The Brother">><</if>>
<<if _id is "npc_wildling">><<set _name = "Wildling">><</if>>
<<if $npcKnownNames[_id] and $npcRevealedName[_id]>><<set _name = $npcRevealedName[_id]>><</if>>
<<set _talkCampNpc = (setup.campNpcs and setup.campNpcs.getById) ? setup.campNpcs.getById(_id) : null>>
<<set _canAssignPosition = !!(_talkCampNpc or (_p and _p._source is "campNpc"))>>
<<set _uniqueTalk = (setup.people and setup.people.getUniqueTalkInteraction) ? setup.people.getUniqueTalkInteraction(_p ?? _id) : null>>
<<set _uniqueTalkAllowed = !!(_uniqueTalk and _obed >= Number(_uniqueTalk.minObedience ?? 0))>>
<<if String($npcTalkMenu[_id]).indexOf("unique:") is 0 and (!_uniqueTalk or $npcTalkMenu[_id] isnot ("unique:" + _uniqueTalk.id))>><<set $npcTalkMenu[_id] = "root">><</if>>
<<set _foreignRitesDoctrine = (setup.foreignRites and setup.foreignRites.getDoctrine) ? setup.foreignRites.getDoctrine() : "balance">>
<<set _foreignRitesDoctrineLabel = (setup.foreignRites and setup.foreignRites.getDoctrineLabel) ? setup.foreignRites.getDoctrineLabel(_foreignRitesDoctrine) : "Hold the Balance">>
<<set _foreignRitesStrength = (setup.foreignRites and setup.foreignRites.getStrength) ? setup.foreignRites.getStrength(_bond) : 0>>
<<set _profile = "generic">>
<<if _id is "npc_kael">><<set _profile = "kael">><</if>>
<<if _id is "npc_outcast_brother">><<set _profile = "brother">><</if>>
<<if _id is "npc_outcast">><<set _profile = "outcast">><</if>>
<<if _id is "npc_wildling">><<set _profile = "wildling">><</if>>
<<npcTalkQuestOfferAvailable _id>>
<<set _open = "They wait for you to decide what this conversation is going to be.">>
<<set _askNote = "Questions share one attempt per turn.">>
<<set _compOk = "The praise lands better than expected.">>
<<set _compBad = "The compliment falls flat.">>
<<set _roleOk = "You define their place cleanly enough that they accept it.">>
<<set _roleBad = "Your explanation sounds improvised, and they hear it.">>
<<set _totemActive = false>>
<<set _totemDone = false>>
<<set _offerQuest = !!_npcTalkQuestOfferAvailable>>
<<set _offerQuestKey = _npcTalkQuestOfferKey ?? "">>
<<set _offerQuestLabel = _npcTalkQuestOfferLabel ?? "">>
<<set _questOfferKicker = "Personal Request">>
<<set _questOfferCopy = "">>
<<set _questAcceptNote = "The task is now tracked on the map.">>
<<set _questRefuseNote = "They do not look pleased by the refusal.">>
<<if _profile is "kael">>
<<if _visits is 1>><<set _open = "Kael keeps one eye on the camp and one on you. 'Say it.'">><<elseif _visits is 2>><<set _open = "He gives you the smallest nod. 'What needs deciding?'">><<else>><<set _open = "Kael makes room for the conversation without wasting posture on comfort.">><</if>>
<<set _askNote = "Ask something useful. Kael gives more when the question has a point.">>
<<set _compOk = "Kael gives one short nod. He is not one to crave praise, but he accepts it as fair payment for good work.">>
<<set _compBad = "Kael barely reacts. 'Save polish for tools,' he says. 'Use plain words with me, $user.'">>
<<set _roleOk = "You frame his place cleanly: scout routes, read risk, keep the camp from walking blind. He approves without saying much.">>
<<set _roleBad = "He hears the uncertainty in it. 'If you do not know where to put me,' Kael says, 'do not fake certainty. Honesty suits you better.'">>
<<elseif _profile is "brother">>
<<if _visits is 1>><<set _open = "The Brother looks up like a man expecting bad news and finding only you instead.">><<elseif _visits is 2>><<set _open = "'What is it now?' he asks. Tired, not hostile.">><<else>><<set _open = "He keeps one shoulder angled toward the tree line even while he listens.">><</if>>
<<set _askNote = "Push too hard and he might shut down. Pick one question and make it count.">>
<<set _compOk = "He smiles boyishly. 'Heh. Coming from a man like you, I suppose I should be proud.'">>
<<set _compBad = "He looks aside. 'I, uh... thank you, $user.'">>
<<set _roleOk = "You tell him exactly what you need: sharp eyes and early warning. He nods. 'Of course. I owe you that much, at least.'">>
<<set _roleBad = "He hears the gap between need and authority and does not like it.">>
<<elseif _profile is "outcast">>
<<if _visits is 1>><<set _open = "She stiffens as you approach, then eases by a fraction. 'You again.'">><<elseif _visits is 2>><<set _open = "She watches the embers instead of you, searching them for some answer.">><<else>><<set _open = "She goes about her work, not noticing your approach immediately.">><</if>>
<<set _askNote = "One good question is worth more than three weak ones with her.">>
<<set _compOk = "A thin smile almost forms, then disappears. 'Those who have a clever tongue are usually trying to make up for something, you know.' The praise lands anyway, because it was spoken without pity.">>
<<set _compBad = "She raises an eyebrow. '...If you say so,' she says.">>
<<set _roleOk = "You name her use plainly: read the tree line, read strangers. Perhaps even other things, in time. She does not argue.">>
<<set _roleBad = "She goes still. Perhaps you worded yourself poorly. 'If I do not have a place here, say it plainly,' she says.">>
<<if $questFlags and $questFlags["q_valued_item_01"]>><<set _totemActive = true>><</if>>
<<if $quests and $quests.length>>
<<for _qi = 0; _qi < $quests.length; _qi++>>
<<if $quests[_qi].id is "q_valued_item_01" and $quests[_qi].status is "complete">><<set _totemDone = true>><<set _totemActive = false>><</if>>
<<if $quests[_qi].id is "q_valued_item_01" and $quests[_qi].status is not "complete">><<set _totemActive = true>><</if>>
<</for>>
<</if>>
<<elseif _profile is "wildling">>
<<if _visits is 1>><<set _open = "She watches you approach like she expects a trick and has already planned how to break from it.">><<elseif _visits is 2>><<set _open = "She is closer to the fire than before, but her eyes still follow your hands before your face.">><<else>><<set _open = "A low sound leaves her throat. Not a word. Not an invitation either. Just permission to continue.">><</if>>
<<set _askNote = "Keep it simple. She follows intent faster than language.">>
<<set _compOk = "She gives a slow wary nod. Whatever praise means to her, she does not reject it.">>
<<set _compBad = "She bares her teeth for an instant. The words land wrong, too smooth to trust.">>
<<set _roleOk = "You speak in simple terms: watch the dark, warn the camp, strike first when something slips through. The idea reaches her.">>
<<set _roleBad = "You lose her halfway through. Too many abstractions, not enough shape.">>
<</if>>
<<if _offerQuestKey is "q_valued_item_01">>
<<set _questOfferCopy = "Halona keeps her gaze on the fire before speaking. \"I dropped something in the trees while I was running,\" she says. \"A carved totem. Small. Easy to miss if you were not looking for it.\" She does not dress the request up as an order. \"I will not pretend it matters to anyone else. It matters to me. If you have the time, and if you find it, bring it back.\" She stops for a second, then adds, a bit hesitantly, \"...please.\"">>
<<set _questAcceptNote = "You agree to retrieve Halona's lost totem. The task is now tracked on the map.">>
<<set _questRefuseNote = "Her jaw tightens. \"Fine,\" she says. \"Forget I asked.\"">>
<<elseif _offerQuestKey is "q_kael_missing_scouts_01">>
<<set _questOfferCopy = "Kael waits until the noise around the fire drops. \"Two scouts I sent toward the river should have returned by now,\" he says. \"Maybe they found trouble. Maybe trouble found them. Either way, I do not like guessing.\" His eyes slide past the campfires into the dark. \"If we move camp toward the nearest stretch of river, we widen the ground we can search without bleeding days into blind wandering. Do that, and I will lead the first look myself.\"">>
<<set _questAcceptNote = "You agree to move camp toward the river and begin the search for Kael's missing scouts. The task is now tracked on the map.">>
<<set _questRefuseNote = "Kael's mouth hardens. \"Then we stay blind a little longer,\" he says. \"I do not like it.\"">>
<</if>>
<</silently>>
<<nobr>>
<div class="talk-wrap">
<div class="talk-shell">
<div class="talk-main">
<div class="talk-card talk-card--hero">
<div class="talk-kicker">Camp Conversation</div>
<div class="talk-title-row"><h2 class="talk-speaker"><<print String(_name).toUpperCase()>></h2></div>
<div class="talk-sub"><<print _role>></div>
<div class="talk-opening"><<print _open>></div>
<div class="talk-prompt">Compliment and Explain Their Role each have their own per-turn use. Questions share one per-turn use across the submenu.</div>
</div>
<div class="talk-card talk-card--response">
<div class="talk-section-label">Exchange</div>
<<if $npcTalkOutput>>
<<print $npcTalkOutput>>
<<elseif _offerQuest and $npcTalkMenu[_id] is "root">>
<div class="talk-quest-offer">
<div class="talk-quest-kicker"><<print _questOfferKicker>></div>
<div class="talk-quest-title"><<print _offerQuestLabel || "Available Task">></div>
<div class="talk-quest-copy"><<print _questOfferCopy>></div>
<div class="talk-quest-actions">
<<button "Accept Task" _here>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<set _qid = _offerQuestKey || "q_valued_item_01">>
<<set _exists = false>>
<<set _created = false>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is _qid>><<set _exists = true>><<break>><</if>>
<</for>>
<<if !_exists>>
<<if _qid is "q_valued_item_01">>
<<set $quests.push({
id: "q_valued_item_01",
name: "The Lost Totem",
desc: "Halona lost a small carved totem while fleeing through the forest.",
objective: "Travel to the marked tile and search for Halona's lost totem.",
status: "active",
targetX: 5,
targetY: 4,
markerRevealed: true,
expeditionPassage: "Quest_q_valued_item_01"
})>>
<<set _created = true>>
<<elseif _qid is "q_kael_missing_scouts_01">>
<<set _pick = setup.map.findNearestTerrainTileFromCamp ? setup.map.findNearestTerrainTileFromCamp("river", { excludeCurrent: true, requireTraversable: true }) : null>>
<<if _pick and _pick.ok>>
<<set $quests.push({
id: "q_kael_missing_scouts_01",
name: "The Missing Scouts",
desc: "Two scouts sent ahead toward the river have not returned. Kael wants the camp moved closer so the search can begin from there.",
objective: "Move camp to the marked river tile and search for the missing scouts.",
status: "active",
targetX: _pick.x,
targetY: _pick.y,
markerRevealed: true,
expeditionPassage: ""
})>>
<<set _created = true>>
<<else>>
<<npcTalkStoreNote "Task Unavailable" "Kael has a direction in mind, but there is no suitable river tile to mark right now." "bad">>
<</if>>
<</if>>
<</if>>
<<if _exists or _created>>
<<set $questFlags[_qid] = true>>
<<if $trackedQuestIds.indexOf(_qid) is -1>><<set $trackedQuestIds.push(_qid)>><</if>>
<<set $trackedQuestId = _qid>>
<<npcTalkStoreNote "Task Accepted" _questAcceptNote "ok">>
<</if>>
<</button>>
<<button "Refuse" _here>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags[_offerQuestKey + "_refused"] = true>>
<<npcTalkStoreNote "Task Refused" _questRefuseNote "bad">>
<</button>>
</div>
</div>
<<else>>
<div class="talk-empty">
<div class="talk-empty-title"><<if $npcTalkMenu[_id] is "question">>Question Menu<<elseif $npcTalkMenu[_id] is "unique:foreignRites">>Her Teachings<<elseif $npcTalkMenu[_id] is "unique:freeSpirit">>A Quiet Request<<elseif $npcTalkMenu[_id] is "unique:claimed">>Train Nara<<else>>Choose Your Approach<</if>></div>
<p><<if $npcTalkMenu[_id] is "unique:foreignRites">>Choose how Halona should guide the tribe's understanding of the sacred.<<elseif $npcTalkMenu[_id] is "unique:freeSpirit">>You can suggest what Nara should watch for, but the choice remains hers.<<elseif $npcTalkMenu[_id] is "unique:claimed">>Choose one lesson. Nara can be trained once per turn.<<else>><<print _askNote>><</if>></p>
</div>
<</if>>
</div>
</div>
<div class="talk-side">
<div class="talk-card talk-card--bond">
<div class="talk-section-label">Bond</div>
<div class="talk-bond-grid">
<div class="talk-bond-stat"><span><<print _bondLabel>></span><strong><<print _bond>></strong></div>
<div class="talk-bond-stat"><span>Obedience</span><strong><<print _obed>></strong></div>
</div>
</div>
<div class="talk-card talk-card--actions">
<div class="talk-section-label"><<if $npcTalkMenu[_id] is "question">>Question Options<<elseif $npcTalkMenu[_id] is "unique:foreignRites">>Teaching Direction<<elseif $npcTalkMenu[_id] is "unique:freeSpirit">>What to Watch For<<elseif $npcTalkMenu[_id] is "unique:claimed">>Training Options<<else>>Conversation Options<</if>></div>
<<if $npcTalkMenu[_id] is "root">>
<div class="talk-action-grid">
<<npcOncePerTurn _id "compliment">>
<<if _canUse>>
<<button "Compliment" _here>>
<<set $npcOncePerTurn[_id]["compliment"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<set _bondDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", _bondKey) : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, _bondKey, _bondDelta)>><</if>>
<<npcTalkStoreResult "Compliment" _compOk _compBad>>
<</button>>
<<else>>
<button class="talk-action--disabled" disabled title="Already used this turn.">Compliment</button>
<</if>>
<<npcOncePerTurn _id "role">>
<<if _canUse>>
<<button "Explain Their Role" _here>>
<<set $npcOncePerTurn[_id]["role"] = _turnNow>>
<<npcCheck _id "wisdom" 15 "silent" 50 "talkIntimidate">>
<<set _obedienceDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyObedienceGain ? setup.traits.modifyObedienceGain(5, "talkIntimidate") : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyObedienceDelta(_id, _talkCampNpc, _p, _obedienceDelta)>><</if>>
<<npcTalkStoreResult "Role" _roleOk _roleBad>>
<</button>>
<<else>>
<button class="talk-action--disabled" disabled title="Already used this turn.">Explain Their Role</button>
<</if>>
<<if _uniqueTalk>>
<<if _uniqueTalkAllowed>>
<<button _uniqueTalk.label _here>><<set $npcTalkMenu[_id] = "unique:" + _uniqueTalk.id>><<set $npcTalkOutput = "">><</button>>
<<else>>
<button class="talk-action--disabled" disabled title="<<print _uniqueTalk.blockedTooltip ?? 'Requirements not met.'>>"><<print _uniqueTalk.label>></button>
<</if>>
<</if>>
<<button "Question" _here>><<set $npcTalkMenu[_id] = "question">><<set $npcTalkOutput = "">><</button>>
<button class="talk-action--disabled" disabled title="Gift is a placeholder for now.">Gift</button>
<<if _canAssignPosition>>
<<button "Assignment">>
<<set $activePersonId = _id>>
<<set $personInfoId = _id>>
<<set $campPositionAssignmentReturn = "Talk_1">>
<<set $npcTalkOutput = "">>
<<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>>
<<goto "Camp_Position_Assignment">>
<</button>>
<</if>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<<elseif $npcTalkMenu[_id] is "unique:foreignRites">>
<div class="talk-question-list">
<div class="talk-empty">
<div class="talk-empty-title">Current doctrine: <<print _foreignRitesDoctrineLabel>></div>
<p>Current strength: <<print _foreignRitesStrength>> Seat of Sacred drift per turn while Halona serves as Rite Keeper.</p>
<p>Changing direction costs 10 Obedience. Reaffirming the current direction costs nothing.</p>
</div>
<<button "Favor the spirits" _here>>
<<set _doctrineChanged = setup.foreignRites.setDoctrine("spirits")>>
<<set _doctrineLabel = setup.foreignRites.getDoctrineLabel()>>
<<set _doctrineNote = _doctrineChanged ? ("Halona will guide the tribe toward the spirits. Obedience -10. Current doctrine: " + _doctrineLabel + ". Current strength: " + setup.foreignRites.getStrength() + ".") : ("Halona is already guiding the tribe toward the spirits. No Obedience spent. Current strength: " + setup.foreignRites.getStrength() + ".")>>
<<npcTalkStoreNote "Teachings Directed" _doctrineNote (_doctrineChanged ? "ok" : "neutral")>>
<</button>>
<<button "Hold the balance" _here>>
<<set _doctrineChanged = setup.foreignRites.setDoctrine("balance")>>
<<set _doctrineLabel = setup.foreignRites.getDoctrineLabel()>>
<<set _doctrineNote = _doctrineChanged ? ("Halona will pull the tribe back toward balance. Obedience -10. Current doctrine: " + _doctrineLabel + ". Current strength: " + setup.foreignRites.getStrength() + ".") : ("Halona is already teaching a balance. No Obedience spent. Current strength: " + setup.foreignRites.getStrength() + ".")>>
<<npcTalkStoreNote "Teachings Directed" _doctrineNote (_doctrineChanged ? "ok" : "neutral")>>
<</button>>
<<button "Favor the chieftain" _here>>
<<set _doctrineChanged = setup.foreignRites.setDoctrine("chieftain")>>
<<set _doctrineLabel = setup.foreignRites.getDoctrineLabel()>>
<<set _doctrineNote = _doctrineChanged ? ("Halona will guide the tribe toward the chieftain. Obedience -10. Current doctrine: " + _doctrineLabel + ". Current strength: " + setup.foreignRites.getStrength() + ".") : ("Halona is already guiding the tribe toward the chieftain. No Obedience spent. Current strength: " + setup.foreignRites.getStrength() + ".")>>
<<npcTalkStoreNote "Teachings Directed" _doctrineNote (_doctrineChanged ? "ok" : "neutral")>>
<</button>>
</div>
<div class="talk-inline-actions">
<<button "Back" _here>><<set $npcTalkMenu[_id] = "root">><<set $npcTalkOutput = "">><</button>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<<elseif $npcTalkMenu[_id] is "unique:freeSpirit">>
<div class="talk-question-list">
<<set _freeState = setup.wildlingFreeSpirit.ensureState()>>
<<set _freeLove = setup.wildlingFreeSpirit.getLove()>>
<<set _freeBlocked = _freeState.pendingRequest ? "Nara is already considering a request." : (_freeLove < 25 ? "Requires 25 Love." : "")>>
<div class="talk-empty">
<div class="talk-empty-title"><<if _freeState.pendingRequest>>Request pending<<else>>No request pending<</if>></div>
<p>A request costs 5 Love and strongly influences only Nara's next excursion. It does not guarantee the result.</p>
</div>
<<for _requestData range [{id:"scavenge",label:"Look for supplies"},{id:"item",label:"Look for something useful"},{id:"scout",label:"Scout the surrounding lands"}]>>
<<if !_freeBlocked>>
<<button _requestData.label _here>><<set _requestResult = setup.wildlingFreeSpirit.request(_requestData.id)>><<npcTalkStoreNote "Request Made" (_requestResult.ok ? "Nara listens, then slips away without promising anything. Love -5." : _requestResult.reason) (_requestResult.ok ? "ok" : "bad")>><</button>>
<<else>>
<button class="talk-action--disabled" disabled><<print _requestData.label>></button>
<</if>>
<</for>>
<<if setup.wildlingFreeSpirit.isMishanAvailable()>>
<<if !_freeBlocked>>
<<button "Shadow the Mishan" _here>><<set _requestResult = setup.wildlingFreeSpirit.request("mishan")>><<npcTalkStoreNote "Request Made" (_requestResult.ok ? "Nara listens, then slips away without promising anything. Love -5." : _requestResult.reason) (_requestResult.ok ? "ok" : "bad")>><</button>>
<<else>>
<button class="talk-action--disabled" disabled>Shadow the Mishan</button>
<</if>>
<<else>>
<button class="talk-action--disabled" disabled>???</button>
<</if>>
</div>
<div class="talk-inline-actions">
<<button "Back" _here>><<set $npcTalkMenu[_id] = "root">><<set $npcTalkOutput = "">><</button>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<<elseif $npcTalkMenu[_id] is "unique:claimed">>
<div class="talk-training-submenu">
<div class="talk-empty talk-training-rules">
<div class="talk-empty-title">One lesson per turn</div>
<p>Training costs 10 Obedience, costs no Action Point, and cannot raise a stat beyond 12 or beyond your own value.</p>
</div>
<div class="talk-training-list">
<<for _statKey range setup.wildlingClaimed.stats>>
<<set _training = setup.wildlingClaimed.getStatus(_statKey)>>
<<set _statLabel = _statKey.charAt(0).toUpperCase() + _statKey.slice(1)>>
<<set _trainingValue = _training.ok ? (_training.current + " → " + (_training.current + 1)) : ("Nara: " + _training.current)>>
<<set _trainingLabel = "<span class='choice-text'>Train " + _statLabel + "</span><span class='choice-note'><span class='talk-training-progress'>" + _trainingValue + "</span><span class='talk-training-player'>Your " + _statLabel + ": " + _training.player + "</span></span>">>
<<capture _statKey _statLabel _trainingLabel _training>>
<<if _training.ok>>
<<button _trainingLabel _here>><<set _trained = setup.wildlingClaimed.train(_statKey)>><<set _trainingNote = _statLabel + " +1. Obedience -10.">><<npcTalkStoreNote "Training Complete" _trainingNote "ok">><</button>>
<<else>>
<<set _trainingDisabled = '<span class="talk-training-disabled-wrap" tabindex="0" data-tip="' + _training.reason + '" aria-label="Train ' + _statLabel + ' unavailable: ' + _training.reason + '"><button class="talk-action--disabled" disabled aria-disabled="true">' + _trainingLabel + '</button></span>'>>
<<print _trainingDisabled>>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<div class="talk-inline-actions talk-training-actions">
<<button "Back" _here>><<set $npcTalkMenu[_id] = "root">><<set $npcTalkOutput = "">><</button>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<<else>>
<div class="talk-question-list">
<<if _profile is "brother">>
<<button "What happened to your people?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<set _bondDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "trust") : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "trust", _bondDelta)>><</if>>
<<set _ok = "His stare goes far away. 'I was stupid.' He stops for a moment, then continues. 'No. Worse. I was weak. I let snakes too close and showed weakness. It almost cost me my life and, worse, my sister's.'">>
<<set _bad = "'You want the short version?' he says. 'We lost.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Can I trust you at my fire?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<set _obedienceDelta = $npcLastCheck.ok ? 5 : -5>>
<<if _p>><<run setup.npcInteractions.applyObedienceDelta(_id, _talkCampNpc, _p, _obedienceDelta)>><</if>>
<<set _ok = "'What? Of course!' he says, sounding mildly insulted. 'You saved me and my sister. As far as I am concerned, you are family. If not by blood, then by the debt I owe you.'">>
<<set _bad = "He squares up. He does not seem to like the question. 'Why would you even ask me that?'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What does your sister need most?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 13 "silent">>
<<if _p and $npcLastCheck.ok>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "trust", (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "trust") : 5))>><</if>>
<<set _ok = "After hearing your question, he looks around as if checking for a predator, then leans in and says conspiratorially, 'A calming herb. A strong one.' He leans back and chuckles to himself. 'Apart from that, nothing much. She's stubborn. She can make do with almost anything... Still, take care of her, will you?' He asks the last part with a hint of pleading hidden behind the joking tone.">>
<<set _bad = "He shrugs the question off. 'Who knows? Women are fickle, and she is worth ten women in that regard.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<elseif _profile is "kael">>
<<button "What worries you most?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<set _bondDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "trust") : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "trust", _bondDelta)>><</if>>
<<set _ok = "Kael does not answer fast. 'Waste,' he says at last. 'Waste of food. Waste of scouts. Waste of chances we do not get twice.'">>
<<set _bad = "He studies you instead of the question. 'Worry is for people who have time to sit in it.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Why did you stay?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<set _bondDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "trust") : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "trust", _bondDelta)>><</if>>
<<set _ok = "'Because leaving would have been easier,' he says. 'Easy answers are usually wrong.'">>
<<set _bad = "'I stayed because I did. Do not carve meaning into every step.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "How would you move us if danger came?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 16 "silent">>
<<set _obedienceDelta = $npcLastCheck.ok ? 5 : -5>>
<<if _p>><<run setup.npcInteractions.applyObedienceDelta(_id, _talkCampNpc, _p, _obedienceDelta)>><</if>>
<<set _ok = "He sketches a route in the dirt. 'Pull in the loose hands. Send two eyes ahead. Keep noise behind the center. We compress.'">>
<<set _bad = "Kael folds his arms. 'If I have to build the whole thought for you here, we are already late.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<elseif _profile is "outcast">>
<<button "Where are you from?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<set _ok = "She answers after a pause. 'From a place by the lake. Stone, drums, and people who learned to look past hunger.'">>
<<set _bad = "Her mouth flattens. 'From before this camp. That is enough.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What should I call you?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<if $npcLastCheck.ok>>
<<set $npcKnownNames[_id] = true>>
<<set $npcRevealedName[_id] = "Halona">>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "love", (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "love") : 5))>><</if>>
<</if>>
<<set _ok = "She studies you for a long second. 'Halona,' she says. 'Do not spend it cheaply.'">>
<<set _bad = "'Names are leverage,' she says. 'You have not earned mine.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What are you still keeping from me?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<if _offerQuest>>
<<npcTalkStoreNote "Question" "She hesitates. There is a request sitting heavier on her than an answer. Hear her out if you want the full truth." "neutral">>
<<elseif _totemActive>>
<<npcTalkStoreNote "Question" "Her answer is brief. The totem is still out there. What matters now is bringing it back." "neutral">>
<<elseif _totemDone>>
<<npcTalkStoreNote "Question" "The old wound is quieter now. You already carried that burden for her once." "neutral">>
<<else>>
<<npcCheck _id "wisdom" 15 "silent">>
<<set _bondDelta = $npcLastCheck.ok ? (setup.traits and setup.traits.modifyBondGain ? setup.traits.modifyBondGain(5, "talkPeaceful", "love") : 5) : -5>>
<<if _p>><<run setup.npcInteractions.applyBondDelta(_id, _talkCampNpc, _p, "love", _bondDelta)>><</if>>
<<set _ok = "She exhales slowly. 'That I still expect bad endings,' she says. 'And that I do not know what to do with people who keep proving me wrong.'">>
<<set _bad = "Her eyes harden. 'Enough prying.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</if>>
<</button>>
<<elseif _profile is "wildling">>
<<button "Where did you come from?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<set _ok = "She points into the dark beyond camp, then draws a crooked half circle across the dirt. Not here, and not welcome back there either.">>
<<set _bad = "She gives you a flat stare and taps the ground under your feet. Here. That is all you get.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What do you want from this camp?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 15 "silent">>
<<set _ok = "Two fingers to her eyes. Palm lowering. Less danger. Then a quick gesture to her mouth. Food. Honest needs, plainly shown.">>
<<set _bad = "She bares her teeth in something that is half warning, half shrug. Whatever she wants, she will not phrase it for you.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Why do you watch the tree line?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<if _p and $npcLastCheck.ok>><<run setup.npcInteractions.applyObedienceDelta(_id, _talkCampNpc, _p, 5)>><</if>>
<<set _ok = "She marks three quick points in the dirt, wipes them away, then jerks her chin outward. Something out there watches back.">>
<<set _bad = "The question spikes her. She turns, shoulders tight, and the rest of the answer disappears into instinct.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<else>>
<<button "How are you settling in?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 12 "silent">>
<<set _ok = "They let out a breath and answer plainly enough. The camp is hard, but not hopeless.">>
<<set _bad = "They answer with polite brevity and keep the real thought to themselves.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What work fits you best?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 13 "silent">>
<<set _ok = "Once you ask it that way, the answer comes easier. They tell you where their hands are most useful.">>
<<set _bad = "They shrug. Either they do not know yet or they do not think the answer matters.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What do you need from me?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<set _ok = "The answer is modest and immediate: clarity, fairness, and a sense that tomorrow is being built on purpose.">>
<<set _bad = "They hesitate too long, then say they need nothing. It does not sound true.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<</if>>
</div>
<div class="talk-inline-actions">
<<button "Back" _here>><<set $npcTalkMenu[_id] = "root">><<set $npcTalkOutput = "">><</button>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<</if>>
</div>
</div>
</div>
</div>
<</nobr>>
<</widget>>
/* ======================================================
CAMP NPC LIST UI
====================================================== */
<<widget "campNpcList">>
<<set _listMode = String($args[0] ?? "all")>>
<<if !$campNpcs or !$campNpcs.length>>
<div class="interact-empty">
Nobody of note to interact with is present.
</div>
<<else>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<set _n = $campNpcs[_i]>>
<<if _n and _n.id and (_listMode is "all" or (_listMode is "generated" and setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(_n)) or (_listMode is "important" and !(setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(_n))))>>
<<set _nid = _n.id>>
<<set _isGeneratedNpc = !!(setup.campNpcs and setup.campNpcs.isGenerated and setup.campNpcs.isGenerated(_n))>>
<<set _p = null>>
<<if $people and $people.length>>
<<for _pi = 0; _pi < $people.length; _pi++>>
<<if $people[_pi] and $people[_pi].id is _nid>>
<<set _p = $people[_pi]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _dispName =
($npcKnownNames and $npcKnownNames[_nid] and $npcRevealedName and $npcRevealedName[_nid])
? $npcRevealedName[_nid]
: (_n.name ?? "Unknown")
>>
<<set _gender = _n.gender ?? _p?.gender ?? "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if _isFemale>>
<<set _affLabel = "Love">>
<<set _affShort = "Lov">>
<<set _affValue = Number(_p ? (_p.love ?? _p.trust ?? 0) : (_n.love ?? _n.trust ?? 0))>>
<<else>>
<<set _affLabel = "Trust">>
<<set _affShort = "Tru">>
<<set _affValue = Number(_p ? (_p.trust ?? 0) : (_n.trust ?? 0))>>
<</if>>
<<set _obedValue = Number(_p ? (_p.obedience ?? _p.influence ?? 0) : (_n.obedience ?? _n.influence ?? 0))>>
<<set _positionLabel = (setup.campPositions and setup.campPositions.getNpcPositionLabel) ? setup.campPositions.getNpcPositionLabel(_nid) : "None">>
<<set _positionDisplay = _positionLabel is "None" ? "Unassigned" : _positionLabel>>
<<set _statKeys = (setup.campNpcs and setup.campNpcs.raidStatKeys) ? setup.campNpcs.raidStatKeys : ["wisdom", "strength", "endurance", "leadership", "charisma", "stewardship"]>>
<<npcTalkQuestOfferAvailable _nid>>
<<set _talkQuestBadgeTitle = _npcTalkQuestOfferLabel ? "Quest available: " + _npcTalkQuestOfferLabel : "Quest available">>
<div class="interact-card">
<div class="interact-main">
<div class="interact-name"><<print _dispName>></div>
<<if _npcTalkQuestOfferAvailable>>
<div class="interact-tags">
<span class="is-alert" title="<<print _talkQuestBadgeTitle>>">! Talk</span>
</div>
<</if>>
<div class="interact-tags">
<<if _positionLabel is "None">>
<span class="is-muted"><<print _positionDisplay>></span>
<<else>>
<span class="is-position"><<print _positionDisplay>></span>
<</if>>
</div>
</div>
<div class="interact-card-grid interact-stat-grid">
<<for _si = 0; _si < _statKeys.length; _si++>>
<<set _statKey = _statKeys[_si]>>
<<set _statLabel = _statKey.charAt(0).toUpperCase() + _statKey.slice(1)>>
<<set _statShort = _statKey is "wisdom" ? "Wis" : (_statKey is "strength" ? "Str" : (_statKey is "endurance" ? "End" : (_statKey is "leadership" ? "Ldr" : (_statKey is "charisma" ? "Cha" : "Stw"))))>>
<<set _statValue = (setup.campNpcs and setup.campNpcs.getRaidStat) ? setup.campNpcs.getRaidStat(_n, _statKey) : Number(_n[_statKey] ?? _p?.[_statKey] ?? _n.raidLeader?.statsBase?.[_statKey] ?? 0)>>
<div class="interact-mini-stat interact-has-tip">
<span><<print _statShort>></span>
<strong><<print _statValue>></strong>
<span class="interact-tooltipbox" role="tooltip"><<print _statLabel>></span>
</div>
<</for>>
</div>
<div class="interact-card-grid interact-bond-grid">
<div class="interact-mini-stat interact-bond-stat interact-has-tip"><span><<print _affShort>></span><strong><<print _affValue>></strong><span class="interact-tooltipbox" role="tooltip"><<print _affLabel>></span></div>
<div class="interact-mini-stat interact-bond-stat interact-has-tip"><span>Obd</span><strong><<print _obedValue>></strong><span class="interact-tooltipbox" role="tooltip">Obedience</span></div>
</div>
<div class="interact-actions">
<<capture _nid>>
<<if _isGeneratedNpc>>
<<link "Interact">>
<<set $activePersonId = _nid>>
<<set $personInfoId = _nid>>
<<set $randomNpcInteractTab = "social">>
<<run if (!State.variables.randomNpcInteractOutput) { State.variables.randomNpcInteractOutput = {}; } if (!State.variables.randomNpcGreetingVisit) { State.variables.randomNpcGreetingVisit = {}; } if (_nid) { delete State.variables.randomNpcInteractOutput[_nid]; delete State.variables.randomNpcGreetingVisit[_nid]; }>>
<<goto "Random_NPC_Interact">>
<</link>>
<<else>>
<span class="interact-action-wrap">
<<link "Talk">>
<<set $activePersonId = _nid>>
<<set $personInfoTab = "friendly">>
<<set $npcTalkOutput = "">>
<<run if (!State.variables.npcTalkMenu) { State.variables.npcTalkMenu = {}; } if (_nid) { delete State.variables.npcTalkMenu[_nid]; }>>
<<goto "Talk_1">>
<</link>>
<<if _npcTalkQuestOfferAvailable>><span class="interact-talk-quest-badge" title="<<print _talkQuestBadgeTitle>>">!</span><</if>>
</span>
<</if>>
<<link "Info">>
<<set $activePersonId = _nid>>
<<set $personInfoId = _nid>>
<<set $personInfoTab = "friendly">>
<<goto "Person_Info">>
<</link>>
<</capture>>
</div>
</div>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "npcTalkQuestOfferAvailable">>
/* add future talk-quest availability rules here so Interact and Talk stay in sync */
<<set _npcTalkQuestOfferAvailable = false>>
<<set _npcTalkQuestOfferKey = "">>
<<set _npcTalkQuestOfferLabel = "">>
<<set _qid = $args[0] ?? "">>
<<set _qp = null>>
<<if $people and $people.length and _qid>>
<<for _qi = 0; _qi < $people.length; _qi++>>
<<if $people[_qi] and $people[_qi].id is _qid>>
<<set _qp = $people[_qi]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _qid is "npc_outcast">>
<<set _qBond = Number(_qp ? (_qp.love ?? _qp.trust ?? 0) : 0)>>
<<set _qObed = Number(_qp ? (_qp.obedience ?? _qp.influence ?? 0) : 0)>>
<<set _qBrotherDone = !!($questFlags and $questFlags["q_outcast_brother_01"])>>
<<set _qTotemActive = !!($questFlags and $questFlags["q_valued_item_01"])>>
<<set _qTotemDone = false>>
<<set _qRefused = !!($questFlags and $questFlags["q_valued_item_01_refused"])>>
<<if $quests and $quests.length>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is "q_outcast_brother_01" and $quests[_qj].status is "complete">><<set _qBrotherDone = true>><</if>>
<<if $quests[_qj].id is "q_valued_item_01" and $quests[_qj].status is not "complete">><<set _qTotemActive = true>><</if>>
<<if $quests[_qj].id is "q_valued_item_01" and $quests[_qj].status is "complete">><<set _qTotemDone = true>><<set _qTotemActive = false>><</if>>
<</for>>
<</if>>
<<if (_qBond >= 5 or _qObed >= 5) and _qBrotherDone and !_qTotemActive and !_qTotemDone and !_qRefused>>
<<set _npcTalkQuestOfferAvailable = true>>
<<set _npcTalkQuestOfferKey = "q_valued_item_01">>
<<set _npcTalkQuestOfferLabel = "The Lost Totem">>
<</if>>
<<elseif _qid is "npc_kael">>
<<set _qTrust = Number(_qp ? (_qp.trust ?? 0) : 0)>>
<<set _qObed = Number(_qp ? (_qp.obedience ?? _qp.influence ?? 0) : 0)>>
<<set _qTutorialDone = !!($questFlags and $questFlags["q_tutorial_end_complete"])>>
<<set _qTutorialTurn = Number(($questFlags and $questFlags["q_tutorial_end_completed_turn"]) ?? -999)>>
<<set _qTurnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _qDelayMet = _qTutorialDone and (_qTurnNow >= (_qTutorialTurn + 2))>>
<<set _qOfferUnlocked = !!($questFlags and $questFlags["q_kael_missing_scouts_offer_unlocked"])>>
<<set _qKaelActive = !!($questFlags and $questFlags["q_kael_missing_scouts_01"])>>
<<set _qKaelDone = false>>
<<set _qKaelFailed = !!($questFlags and $questFlags["q_kael_missing_scouts_01_failed"])>>
<<set _qRefused = !!($questFlags and $questFlags["q_kael_missing_scouts_01_refused"])>>
<<if $quests and $quests.length>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "active">><<set _qKaelActive = true>><</if>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "complete">><<set _qKaelDone = true>><<set _qKaelActive = false>><</if>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "failed">><<set _qKaelFailed = true>><<set _qKaelActive = false>><</if>>
<</for>>
<</if>>
<<if _qOfferUnlocked and !_qKaelActive and !_qKaelDone and !_qKaelFailed and !_qRefused>>
<<set _npcTalkQuestOfferAvailable = true>>
<<set _npcTalkQuestOfferKey = "q_kael_missing_scouts_01">>
<<set _npcTalkQuestOfferLabel = "The Missing Scouts">>
<</if>>
<</if>>
<</widget>>
<<widget "npcAnyTalkQuestOfferAvailable">>
<<set _anyNpcTalkQuestOfferAvailable = false>>
<<set _anyNpcTalkQuestOfferLabel = "">>
<<if $campNpcs and $campNpcs.length>>
<<for _ai = 0; _ai < $campNpcs.length; _ai++>>
<<set _campNpc = $campNpcs[_ai]>>
<<set _campNpcId = (_campNpc and _campNpc.id) ? _campNpc.id : "">>
<<if _campNpcId>>
<<npcTalkQuestOfferAvailable _campNpcId>>
<<if _npcTalkQuestOfferAvailable>>
<<set _anyNpcTalkQuestOfferAvailable = true>>
<<set _anyNpcTalkQuestOfferLabel = _npcTalkQuestOfferLabel ?? "">>
<<break>>
<</if>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
NPC ALIVE CHECK
Usage:
<<npcAlive "npc_id">>
Result:
_npcAlive = true / false
====================================================== */
<<widget "npcAlive">>
<<set _npcAlive = false>>
<<set _nid = $args[0]>>
<<if $people and $people.length and _nid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _nid>>
<<set _npcAlive = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
CAMP NPC UPDATES
====================================================== */
/* Rename NPC
Usage: <<renameCampNpc "npc_id" "New Name">>
*/
<<widget "renameCampNpc">>
<<set _id = $args[0]>>
<<set _newName = $args[1]>>
<<if $campNpcs>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i].id is _id>>
<<set $campNpcs[_i].name = _newName>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* Track NPC conversations
Usage: <<npcTalk "npc_id">>
*/
<<widget "npcTalk">>
<<set _id = $args[0]>>
<<if !$npcTalks>><<set $npcTalks = {}>><</if>>
<<set $npcTalks[_id] = ($npcTalks[_id] ?? 0) + 1>>
<</widget>>
/* ======================================================
QUEST GENERATION (ADJACENT)
====================================================== */
/* Adds a quest to a random tile adjacent to the camp
Usage:
<<addQuestAdjacentToCamp
"quest_id"
"Quest Name"
"Description"
"Objective"
"QuestPassage">>
*/
<<widget "addQuestAdjacentToCamp">>
<<set _qid = $args[0]>>
<<set _name = $args[1]>>
<<set _desc = $args[2]>>
<<set _obj = $args[3]>>
<<set _pass = $args[4]>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
/* collect ORTHOGONAL adjacent tiles only (1 move: up/down/left/right) */
<<set _cands = []>>
<<set _dirs = [
{dx: 1, dy: 0},
{dx: -1, dy: 0},
{dx: 0, dy: 1},
{dx: 0, dy: -1}
]>>
<<for _i = 0; _i < _dirs.length; _i++>>
<<set _x = $campX + _dirs[_i].dx>>
<<set _y = $campY + _dirs[_i].dy>>
<<if _x >= 0 and _y >= 0 and _x < $mapSize and _y < $mapSize and !(setup.map && setup.map.isQuestTargetBlocked && setup.map.isQuestTargetBlocked(_x, _y, "player_camp"))>>
<<set _cands.push({ x:_x, y:_y })>>
<</if>>
<</for>>
/* select random tile */
<<if _cands.length>>
<<set _pick = _cands[random(0, _cands.length - 1)]>>
<<set $quests.push({
id: _qid,
name: _name,
desc: _desc,
objective: _obj,
status: "active",
targetX: _pick.x,
targetY: _pick.y,
markerRevealed: true,
expeditionPassage: _pass
})>>
<<set $questFlags[_qid] = true>>
<</if>>
<</if>>
<</widget>>
/* ======================================================
GENERIC COUNTER (REUSABLE)
====================================================== */
<<widget "questCounterUpdate">>
<<set _qid = String($args[0] ?? "")>>
<<set _cur = Number($args[1] ?? 0)>>
<<set _goal = Number($args[2] ?? 0)>>
<<set _label = String($args[3] ?? "Progress")>>
<<if !_qid>><<return>><</if>>
<<if !_goal or _goal <= 0>><<set _goal = 1>><</if>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set $quests[_i].progress = _cur>>
<<set $quests[_i].goal = _goal>>
<<set $quests[_i].objective = _label + ": " + _cur + "/" + _goal>>
<<if String($quests[_i].status) is "active" and _cur >= _goal>>
<<set $quests[_i].status = "complete">>
<</if>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
MARKERLESS QUEST ADD (VICTORY / TRACKERS)
====================================================== */
<<widget "addQuestMarkerless">>
<<set _qid = String($args[0] ?? "")>>
<<set _name = String($args[1] ?? "")>>
<<set _desc = String($args[2] ?? "")>>
<<set _obj = String($args[3] ?? "")>>
<<set _pass = String($args[4] ?? "")>>
<<if !_qid or !_name>><<return>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* prevent duplicates */
<<if $questFlags[_qid]>><<return>><</if>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: _name,
desc: _desc,
objective: _obj,
status: "active",
markerRevealed: false,
expeditionPassage: _pass
})>>
<</widget>>
/* ======================================================
VICTORY COUNTING
====================================================== */
<<widget "countEnemyTribesRemaining">>
<<set _regionProgress = setup.regionUnification.recalculate()>>
<</widget>>
/* ======================================================
VICTORY QUEST START (CALL IN FINAL TUTORIAL)
====================================================== */
<<widget "startVictory_DominateRegion">>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.q_dominate_region_started>>
<<set $questFlags.q_dominate_region_started = true>>
/* snapshot enemy list + baseline counts */
<<set $victoryCampIds = null>>
<<set $enemyTribesInitial = null>>
<<set $enemyTribesRemaining = null>>
<<countEnemyTribesRemaining>>
<<set _victoryObjective = "Tribes defeated or federated: 0/" + String($enemyTribesInitial ?? 0)>>
<<addQuestMarkerless
"q_dominate_region"
"Unify the Region"
"Bring the surrounding tribes under a single regional order, whether through conquest or federation."
_victoryObjective
"Quest_q_dominate_region"
>>
<</if>>
<</widget>>
/* ======================================================
VICTORY QUEST UPDATE (CALL IN HUB_1 EACH TURN)
====================================================== */
<<widget "updateVictory_DominateRegion">>
/* Don’t run unless started */
<<if !$questFlags>><<return>><</if>>
<<if !$questFlags.q_dominate_region_started>><<return>><</if>>
/* Find quest */
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is "q_dominate_region">>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Separate checks: never touch _q.status if _q is null. Completed legacy
saves remain complete and receive no automatic reward migration. */
<<if !_q>><<return>><</if>>
<<if String(_q.status) is not "active">><<return>><</if>>
<<set _q.name = "Unify the Region">>
<<set _q.desc = "Bring the surrounding tribes under a single regional order, whether through conquest or federation.">>
/* Recount */
<<countEnemyTribesRemaining>>
/* Goal = number of tribes in the stable tutorial-time snapshot. */
<<set _goal = _regionProgress.total>>
<<set _resolved = _regionProgress.resolvedCount>>
/* Update reusable counter (also completes quest when met) */
<<questCounterUpdate "q_dominate_region" _resolved _goal "Tribes defeated or federated">>
/* Completion is historical and permanent; live federation membership is
snapshotted only at this moment. */
<<if String(_q.status) is "complete">>
<<set _completion = setup.regionUnification.finalizeCompletion(_regionProgress)>>
<<if _completion.firstCompletion and !_completion.state.completionRouted>>
<<set _completion.state.completionRouted = true>>
<<goto "Quest_UnifyRegion_Complete">>
<</if>>
<</if>>
<</widget>>
/* ======================================================
TRIBE STUFF
====================================================== */
<<widget "getTribeById">>
<<set _id = $args[0]>>
<<set _found = null>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i].id is _id>>
<<set _found = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set $activeTribe = _found>>
<</widget>>
<<widget "tribeStatLine">>
<<set _stats = $args[0]>>
<<if _stats>>
<div class="tribe-statsline">
<<if _stats.fish is not null>><span class="tribe-stat">🐟 <<print _stats.fish>></span><</if>>
<<if _stats.food is not null>><span class="tribe-stat">🍖 <<print _stats.food>></span><</if>>
<<if _stats.hides is not null>><span class="tribe-stat">🧥 <<print _stats.hides>></span><</if>>
<<if _stats.wood is not null>><span class="tribe-stat">🪵 <<print _stats.wood>></span><</if>>
<<if _stats.stone is not null>><span class="tribe-stat">🪨 <<print _stats.stone>></span><</if>>
</div>
<</if>>
<</widget>>
<<widget "tribeRow">>
<<set _t = $args[0]>>
<<set _tid = String(_t.id)>>
<<set _rel = Number((setup.tribes and setup.tribes.getEffectiveRelations) ? setup.tribes.getEffectiveRelations(_t) : (_t.relations ?? 0))>>
<<set _relClass = _rel >= 50 ? "is-good" : (_rel >= 10 ? "is-warm" : (_rel <= -40 ? "is-hostile" : (_rel < 0 ? "is-cold" : "is-neutral")))>>
<<set _temp = _t.temperament ?? "unknown">>
<<set _mood = (setup.tribes and setup.tribes.getMoodState) ? setup.tribes.getMoodState(_t) : (_t.mood?.state ?? _t.mood ?? "none")>>
<<set _mil = Number(_t.stats?.milStr ?? _t.milStr ?? 0)>>
<<set _pop = Number(_t.stats?.population ?? _t.population ?? 0)>>
<<set _isFed = !!(setup.federation and setup.federation.hasFederation and setup.federation.hasFederation() and setup.federation.isMember and setup.federation.isMember(_tid))>>
<<set _peace = !!(_t.peaceActive or ($tribePeaceUntil and $tribePeaceUntil[_tid] and Number($tribePeaceUntil[_tid]) > Number($turn ?? 0)))>>
<<set _questTarget = !!($questTargetNpcCamps and $questTargetNpcCamps[_tid])>>
<<set _mishanPriority = !!(setup.mishan and setup.mishan.isCampaignVisible and setup.mishan.isCampaignVisible() and setup.mishan.isMishanId and setup.mishan.isMishanId(_tid))>>
<<set _mishanView = _mishanPriority and setup.mishan.getTribeListView ? setup.mishan.getTribeListView() : null>>
<<set _mishanTributary = !!(setup.mishan and setup.mishan.isCampaignVisible and setup.mishan.isCampaignVisible() and setup.mishan.isTributary and setup.mishan.isTributary(_tid))>>
<div @class="'tribe-card othertribes-card ' + _relClass + (_mishanPriority ? ' is-mishan-priority' : '') + (_mishanView and _mishanView.defeated ? ' is-mishan-defeated' : '')">
<div class="tribe-main">
<div class="tribe-name"><<print _t.name>></div>
<<if !_t.contacted or _isFed or _peace or _questTarget or _mishanPriority or _mishanTributary>>
<div class="othertribes-tags">
<<if _mishanPriority and _mishanView and _mishanView.defeated>><span class="is-mishan-defeated-badge">Defeated</span>
<<elseif _mishanPriority>><span class="is-mishan-badge">Walled Power</span><</if>>
<<if _mishanTributary>><span class="is-mishan-tributary">Mishan Tributary</span><</if>>
<<if _questTarget>><span>Quest Target</span><</if>>
<<if !_t.contacted and !_questTarget>><span>First Contact</span><</if>>
<<if _isFed>><span class="is-federation">Federation</span><</if>>
<<if _peace>><span>Peace</span><</if>>
</div>
<</if>>
</div>
<<if _mishanPriority and _mishanView>>
<<if _mishanView.defeated>>
<div class="mishan-list-ended"><strong>Campaign ended</strong><span>Mishan has been defeated.</span></div>
<<else>>
<div class="mishan-list-campaign">
<div class="mishan-list-stats">
<div class="mishan-list-stat" tabindex="0" aria-describedby="mishan-list-anger-tip"><span>Anger</span><strong><<print _mishanView.angerTier>></strong><span class="mishan-list-tooltip" id="mishan-list-anger-tip" role="tooltip"><strong>Mishan Anger · <<print _mishanView.anger>></strong><span>How aggressively Mishan is likely to respond to your actions.</span></span></div>
<div class="mishan-list-stat" tabindex="0" aria-describedby="mishan-list-patience-tip"><span>Patience</span><strong><<print _mishanView.patienceText>></strong><span class="mishan-list-tooltip" id="mishan-list-patience-tip" role="tooltip"><strong>Mishan Patience</strong><span>How long before Mishan takes the initiative.</span></span></div>
<div class="mishan-list-stat" tabindex="0" aria-describedby="mishan-list-military-tip"><span>Military</span><strong><<print _mishanView.militaryLabel>></strong><span class="mishan-list-tooltip" id="mishan-list-military-tip" role="tooltip"><strong>Military Strength · <<print _mishanView.militaryValue>></strong><span>The current overall strength of Mishan forces.</span></span></div>
<div class="mishan-list-stat" tabindex="0" aria-describedby="mishan-list-tributaries-tip"><span>Tributaries</span><strong><<print _mishanView.tributaryCount>></strong><span class="mishan-list-tooltip" id="mishan-list-tributaries-tip" role="tooltip"><strong>Mishan Tributaries</strong><span>Tribes currently under Mishan control.</span></span></div>
<div class="mishan-list-stat" tabindex="0" aria-describedby="mishan-list-outposts-tip"><span>Outposts</span><strong><<print _mishanView.outpostCount>></strong><span class="mishan-list-tooltip" id="mishan-list-outposts-tip" role="tooltip"><strong>Extraction Outposts</strong><span>Active Mishan outposts extending their regional control.</span></span></div>
</div>
<div class="mishan-list-preparedness" tabindex="0" aria-describedby="mishan-list-preparedness-tip">
<div class="mishan-list-preparedness-line"><span>Preparedness</span><strong><<print _mishanView.preparedness>>%</strong></div>
<div class="mishan-list-meter" role="progressbar" aria-label="Preparedness" aria-valuemin="0" aria-valuemax="100" @aria-valuenow="_mishanView.preparedness"><span @style="'width:' + _mishanView.preparedness + '%'"></span></div>
<span class="mishan-list-tooltip" id="mishan-list-preparedness-tip" role="tooltip"><strong>Preparedness · <<print _mishanView.preparedness>>%</strong><span>How ready your tribe and allies are to confront Mishan.</span></span>
</div>
</div>
<</if>>
<div class="tribe-act">
<<capture _tid>>
<<link "Campaign">>
<<set $activeTribeId = _tid>>
<<goto "Tribe_Info">>
<</link>>
<</capture>>
</div>
<<else>>
<div class="othertribes-card-grid">
<div class="othertribes-card-stat"><span>Relations</span><strong><<if _rel > 0>>+<</if>><<print _rel>></strong></div>
<div class="othertribes-card-stat"><span>Temperament</span><strong><<print _temp>></strong></div>
<div class="othertribes-card-stat"><span>Mood</span><strong><<print _mood>></strong></div>
<div class="othertribes-card-stat"><span>Mil Str</span><strong><<print _mil>></strong></div>
<div class="othertribes-card-stat"><span>Population</span><strong><<print _pop>></strong></div>
</div>
<div class="tribe-act">
<<if _questTarget>>
<<capture _tid>>
<<link "Info">>
<<set $activeTribeId = _tid>>
<<set $tribeInfoTab = "hostile">>
<<goto "Tribe_Info">>
<</link>>
<</capture>>
<<elseif !_t.contacted>>
<<capture _tid>>
<<button "First contact">>
<<set $activeTribeId = _tid>>
<<script>>
Dialog.setup("First contact");
Dialog.wiki("<<include 'Tribe_FirstContact_Dialog'>>");
Dialog.open();
<</script>>
<</button>>
<</capture>>
<<else>>
<<capture _tid>>
<<link "Info">>
<<set $activeTribeId = _tid>>
<<goto "Tribe_Info">>
<</link>>
<</capture>>
<</if>>
</div>
<</if>>
</div>
<</widget>>
<<widget "tribeList">>
<<set _any = false>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<set _t = $tribes[_i]>>
/* SHOW RULE:
- contacted OR metTribeIds[id] (compat)
- active quest target tribes (visible for raid obligations)
- NOT merely "discovered"
*/
<<if _t and ( !!_t.contacted or ($metTribeIds and $metTribeIds[_t.id]) or ($questTargetNpcCamps and $questTargetNpcCamps[_t.id]) )>>
<<set _any = true>>
<<tribeRow _t>>
<</if>>
<</for>>
<</if>>
<<if !_any>>
<div class="tribe-empty">You know of no other tribes… yet.</div>
<</if>>
<</widget>>
<<widget "destroyTribe">>
<<set _tid = String($args[0] ?? "")>>
<<if !_tid>><<return>><</if>>
/* One-time guard */
<<if !$defeatedTribes>><<set $defeatedTribes = {}>><</if>>
<<if $defeatedTribes[_tid]>><<return>><</if>>
/* Get tribe name BEFORE removal */
<<set _tname = "Unknown Tribe">>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is _tid>>
<<set _tname = $tribes[_i].name ?? _tname>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Route all destruction through the canonical helper so dependent systems clean up immediately. */
<<run setup.tribes?.destroyTribeById?.(_tid, { setLastDestroyed: true })>>
/* Remove from $tribes */
<<if $tribes and $tribes.length>>
<<set $tribes = $tribes.filter(t => t and String(t.id) !== _tid)>>
<</if>>
/* Remove from canonical State.variables.tribes too (keeps setup.tribes in sync) */
<<run try { if (Array.isArray(State.variables.tribes)) { State.variables.tribes = State.variables.tribes.filter(t => t && String(t.id) !== _tid); } } catch (e) {} >>
/* Clear selections that point to this tribe */
<<if String($activeTribeId ?? "") is _tid>><<set $activeTribeId = null>><</if>>
<<if String($raidTargetId ?? "") is _tid>><<set $raidTargetId = null>><</if>>
/* Remove from known/aux stores (use delete to avoid <<unset>> expression issues) */
<<if $metTribeIds>><<run delete $metTribeIds[_tid]>><</if>>
<<if $otherTribeData>><<run delete $otherTribeData[_tid]>><</if>>
<<if $revealedNpcCamps>><<run delete $revealedNpcCamps[_tid]>><</if>>
<<if $scoutedNpcUntil>><<run delete $scoutedNpcUntil[_tid]>><</if>>
/* If $metTribes stores NAMES, remove by name */
<<if $metTribes and $metTribes.length>>
<<set $metTribes = $metTribes.filter(n => String(n) !== String(_tname))>>
<</if>>
/* Remove mirrored map icon entry if you use $mapIcons */
<<if $mapIcons and $mapIcons.length>>
<<set $mapIcons = $mapIcons.filter(ic => ic and String(ic.id) !== _tid)>>
<</if>>
/* Remove queued events (raid/trade/etc) belonging to that tribe */
<<if $eventQueue and $eventQueue.length>>
<<set $eventQueue = $eventQueue.filter(e => !(e and e.event and String(e.event.sourceTribeId ?? "") is _tid))>>
<</if>>
/* The canonical destroyTribeById() helper queues the guarded destruction event. */
<</widget>>
<<widget "debugKillTribe">>
<<set _tid = String($args[0] ?? "")>>
<<if !_tid>>
<<print "No tribe id passed to debugKillTribe">>
<<return>>
<</if>>
/* Find the tribe and zero its population */
<<set _found = false>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is _tid>>
/* try all common population fields */
<<set $tribes[_i].pop = 0>>
<<set $tribes[_i].population = 0>>
<<if $tribes[_i].stats>>
<<set $tribes[_i].stats.population = 0>>
<</if>>
<<set _found = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !_found>>
<<print "Tribe not found: " + _tid>>
<<return>>
<</if>>
/* Call your real destroy logic */
<<destroyTribe _tid>>
<<print "DEBUG: Tribe killed → " + _tid>>
<</widget>>
/*TUTORIAL*/
<<widget "tutOpen">>
<<set _p = $args[0]>>
<<run Dialog.setup("Tutorial")>>
<<run Dialog.wiki('<<include "' + _p + '">>')>>
<<run Dialog.open()>>
<</widget>>
<<widget "tutStart">>
<<tutOpen "Tut_Intro">>
<</widget>>
<<widget "tutStop">>
<<run Dialog.close()>>
<</widget>>
/* ======================================================
INVENTORY (ITEMS + EQUIPMENT) UI WIDGETS
- Parallel to Artifacts screen
====================================================== */
<<widget "invEnsure">>
<<run (function () {
try { if (setup.inventory && typeof setup.inventory.ensureState === "function") setup.inventory.ensureState(); } catch (e) {}
try {
State.variables.invFilter = String(State.variables.invFilter || "all").toLowerCase();
State.variables.invSort = String(State.variables.invSort || "type").toLowerCase();
if (setup.inventory && typeof setup.inventory.ensureUiState === "function") setup.inventory.ensureUiState();
} catch (e) {}
})();>>
<</widget>>
<<widget "invTabs">>
<<invEnsure>>
<div class="inv-tabs inv-mode-tabs" role="tablist" aria-label="Inventory views">
<<if $invTab is "items">>
<button class="macro-button inv-tab active is-current" disabled aria-current="page">Inventory</button>
<<else>>
<<button "Inventory">>
<<set $invTab = "items">>
<<goto "Inventory">>
<</button>>
<</if>>
<<if $invTab is "artifacts">>
<button class="macro-button inv-tab active" disabled>Relics</button>
<<else>>
<<button "Relics">>
<<set $invTab = "artifacts">>
<<goto "Inventory">>
<</button>>
<</if>>
</div>
<</widget>>
<<widget "invCapacitySummary">>
<<invEnsure>>
<<set _cap = (setup.inventory && setup.inventory.getCapacityMeta) ? setup.inventory.getCapacityMeta() : { used: 0, max: 0, pct100: 0, stateLabel: "Light", tone: "light" } >>
<div class="inv-capacity inv-capacity-modern is-<<print _cap.tone>> inv-tooltip-anchor" data-inv-tip="Tracks occupied inventory slots. Higher load makes the inventory feel more crowded, even if it does not impose a movement penalty yet.">
<div class="inv-capacity-head">
<span class="inv-capacity-label">Carry</span>
<span class="inv-capacity-state"><<print _cap.stateLabel>></span>
<span class="inv-capacity-value"><<print _cap.used>> / <<print _cap.max>></span>
</div>
<div class="inv-capacity-bar">
<span class="inv-capacity-fill" style="width: <<print Math.max(4, _cap.pct100)>>%"></span>
</div>
</div>
<</widget>>
<<widget "invCollectionControls">>
<<invEnsure>>
<<set _flt = String($invFilter || "all")>>
<<set _sort = String($invSort || "type")>>
<div class="inv-collection-tools">
<div class="inv-chip-group">
<div class="inv-chip-group-label">Filter</div>
<div class="inv-chip-row">
<<for _opt range [{ key: "all", label: "All" }, { key: "materials", label: "Materials" }, { key: "consumables", label: "Consumables" }, { key: "gear", label: "Gear" }, { key: "quest", label: "Quest" }]>>
<<if _flt is _opt.key>>
<button type="button" class="macro-button inv-chip active" disabled><<print _opt.label>></button>
<<else>>
<<capture _opt>>
<<button _opt.label>>
<<set $invFilter = _opt.key>>
<<run setup.inventory.ensureUiState()>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
</div>
<div class="inv-chip-group is-sort">
<div class="inv-chip-group-label">Sort</div>
<div class="inv-chip-row">
<<for _opt range [{ key: "type", label: "Type" }, { key: "stack", label: "Stack" }, { key: "durability", label: "Durability" }, { key: "name", label: "Name" }]>>
<<if _sort is _opt.key>>
<button type="button" class="macro-button inv-chip active" disabled><<print _opt.label>></button>
<<else>>
<<capture _opt>>
<<button _opt.label>>
<<set $invSort = _opt.key>>
<<run setup.inventory.ensureUiState()>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
</div>
</div>
<</widget>>
<<widget "invItemGrid">>
<<invEnsure>>
<<set _order = (setup.inventory && setup.inventory.listViewUids) ? setup.inventory.listViewUids($invFilter, $invSort) : (($inv.order && $inv.order.length) ? $inv.order : Object.keys($inv.items))>>
<div class="inv-gridbox">
<div class="inv-grid">
<<if !_order.length>>
<div class="inv-grid-empty">No items match the current filter.</div>
<<else>>
<<for _i = 0; _i < _order.length; _i++>>
<<set _uid = String(_order[_i])>>
<<set _rec = $inv.items[_uid]>>
<<if !_rec>><<continue>><</if>>
<<set _def = setup.inventory.defById(_rec.id)>>
<<set _name = _def ? _def.name : _rec.id>>
<<set _imgSrc = setup.inventory.getItemIconSrc ? setup.inventory.getItemIconSrc(_rec.id) : ("images/Items/materials/" + String(_rec.id) + ".png")>>
<<set _typeLabel = setup.inventory.getItemTypeLabel ? setup.inventory.getItemTypeLabel(_def) : "Item">>
<<set _rarityClass = setup.inventory.getItemRarityClass ? setup.inventory.getItemRarityClass(_def) : "rarity-common">>
<<set _rarityLabel = setup.inventory.getItemRarityLabel ? setup.inventory.getItemRarityLabel(_def) : "Common">>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _name + " (" + _typeLabel + ")" + '"><img class="inv-icon" src="' + _imgSrc + '" alt="' + _name + '"></span>' >>
<<set _qty = Math.max(0, Number(_rec.qty || 0))>>
<<set _durMeta = (setup.inventory && setup.inventory.getDurabilityMeta) ? setup.inventory.getDurabilityMeta(_rec, _def) : null>>
<<set _sel = ($invSel and String($invSel) is _uid)>>
<<set _equippedSlot = (setup.inventory && setup.inventory.getEquippedSlotForUid) ? setup.inventory.getEquippedSlotForUid(_uid) : null>>
<div class="inv-cell inv-item-btn">
<div class="inv-cell-flag"><<print _typeLabel>></div>
<<if _rarityClass is not "rarity-common">>
<div class="inv-cell-rarity"><<print _rarityLabel>></div>
<</if>>
<<if _sel>>
<div class="inv-cell-pin">Selected</div>
<</if>>
<<capture _uid _label>>
<<button _label>>
<<set $invSel = String(_uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<<if _durMeta>>
<div class="inv-cell-dur inv-cell-dur-badge is-<<print _durMeta.tone>>"><<print _durMeta.label>></div>
<<if !_durMeta.indestructible>>
<div class="inv-cell-durbar is-<<print _durMeta.tone>>"><span style="width: <<print _durMeta.pct100>>%"></span></div>
<</if>>
<</if>>
<<if _qty && _qty > 1>>
<div class="inv-cell-qty"><<print _qty>></div>
<</if>>
</div>
<</for>>
<</if>>
</div>
</div>
<</widget>>
<<widget "invDetailsFooter">>
<<invEnsure>>
<<invDetails>>
<</widget>>
<<widget "invEquipPanel">>
<<invEnsure>>
<<set _head = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Head", $invSel) : null>>
<<set _body = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Body", $invSel) : null>>
<<set _armL = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("ArmLeft", $invSel) : null>>
<<set _armR = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("ArmRight", $invSel) : null>>
<<set _legs = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Legs", $invSel) : null>>
<div class="inv-equip-board-shell">
<div class="inv-equip-board">
<div class="inv-equip-silhouette" aria-hidden="true"></div>
<div class="inv-equip-node equip-head">
<div class="inv-equip-node-slot">Head</div>
<<if _head and _head.hasItem>>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _head.title + '"><img class="equip-icon" src="' + _head.iconSrc + '" alt="' + _head.name + '"></span>' >>
<div class="inv-equip-node-item">
<<capture _head _label>>
<<button _label>>
<<set $invSel = String(_head.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _head.name>></div>
<<if _head.durability>><div class="inv-equip-node-dur"><<print _head.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-arm-left">
<div class="inv-equip-node-slot">Left Hand</div>
<<if _armL and _armL.hasItem>>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _armL.title + '"><img class="equip-icon" src="' + _armL.iconSrc + '" alt="' + _armL.name + '"></span>' >>
<div class="inv-equip-node-item">
<<capture _armL _label>>
<<button _label>>
<<set $invSel = String(_armL.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _armL.name>></div>
<<if _armL.durability>><div class="inv-equip-node-dur"><<print _armL.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-body">
<div class="inv-equip-node-slot">Body</div>
<<if _body and _body.hasItem>>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _body.title + '"><img class="equip-icon" src="' + _body.iconSrc + '" alt="' + _body.name + '"></span>' >>
<div class="inv-equip-node-item">
<<capture _body _label>>
<<button _label>>
<<set $invSel = String(_body.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _body.name>></div>
<<if _body.durability>><div class="inv-equip-node-dur"><<print _body.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-arm-right">
<div class="inv-equip-node-slot">Right Hand</div>
<<if _armR and _armR.hasItem>>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _armR.title + '"><img class="equip-icon" src="' + _armR.iconSrc + '" alt="' + _armR.name + '"></span>' >>
<div class="inv-equip-node-item">
<<capture _armR _label>>
<<button _label>>
<<set $invSel = String(_armR.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _armR.name>></div>
<<if _armR.durability>><div class="inv-equip-node-dur"><<print _armR.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-legs">
<div class="inv-equip-node-slot">Legs</div>
<<if _legs and _legs.hasItem>>
<<set _label = '<span class="inv-icon-tip" data-inv-tip="' + _legs.title + '"><img class="equip-icon" src="' + _legs.iconSrc + '" alt="' + _legs.name + '"></span>' >>
<div class="inv-equip-node-item">
<<capture _legs _label>>
<<button _label>>
<<set $invSel = String(_legs.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _legs.name>></div>
<<if _legs.durability>><div class="inv-equip-node-dur"><<print _legs.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
</div>
<<if $inv and $inv.log and $inv.log.length>>
<div class="inv-log">
<<for _i = Math.max(0, $inv.log.length - 3); _i < $inv.log.length; _i++>>
<div class="inv-log-line"><<print $inv.log[_i]>></div>
<</for>>
</div>
<</if>>
</div>
<</widget>>
<<widget "invDetails">>
<<invEnsure>>
<<set _items = ($inv and $inv.items) ? $inv.items : {}>>
<<if !$invSel>>
<div class="inv-details-empty">Select an item to view details.</div>
<<else>>
<<set _rec = _items[$invSel]>>
<<if !_rec>>
<<set $invSel = null>>
<div class="inv-details-empty">That item is no longer available.</div>
<<else>>
<<set _id = String(_rec.id)>>
<<set _def = (setup.inventory && setup.inventory.defById) ? setup.inventory.defById(_id) : null>>
<<set _name = _def ? _def.name : _id>>
<<set _desc = _def ? _def.desc : "">>
<<set _tags = (_def and _def.tags) ? _def.tags : []>>
<<set _slot = _tags.includes("Head") ? "Head" : (_tags.includes("Body") ? "Body" : (_tags.includes("ArmLeft") ? "ArmLeft" : (_tags.includes("ArmRight") ? "ArmRight" : (_tags.includes("Legs") ? "Legs" : ""))))>>
<<set _type = (setup.inventory and setup.inventory.getItemTypeLabel) ? setup.inventory.getItemTypeLabel(_def) : (_slot ? "Armor" : (_tags.includes("Consumable") ? "Consumable" : (_tags.includes("Material") ? "Material" : (_tags.includes("Artifact") or _tags.includes("Relic") ? "Artifact" : "Item"))))>>
<<set _slotLabel = _slot is "ArmLeft" ? "Left Hand" : (_slot is "ArmRight" ? "Right Hand" : _slot)>>
<<set _stack = _def ? !!_def.stackable : false>>
<<set _rarity = (setup.inventory and setup.inventory.getItemRarityLabel) ? setup.inventory.getItemRarityLabel(_def) : "Common">>
<<set _rarityClass = (setup.inventory and setup.inventory.getItemRarityClass) ? setup.inventory.getItemRarityClass(_def) : "rarity-common">>
<<set _equipped = (_slot and $inv and $inv.equipped and $inv.equipped[_slot] is $invSel)>>
<<set _qty = Math.max(0, Math.floor(Number(_rec.qty || 0)))>>
<<set _durMeta = (setup.inventory and setup.inventory.getDurabilityMeta) ? setup.inventory.getDurabilityMeta(_rec, _def) : null>>
<<set _slotTaken = (_slot and $inv and $inv.equipped and $inv.equipped[_slot]) ? $inv.equipped[_slot] : null>>
<<set _slotTakenName = (_slotTaken and _slotTaken is not $invSel and $inv.items[_slotTaken]) ? ((setup.inventory and setup.inventory.defById and setup.inventory.defById($inv.items[_slotTaken].id)) ? setup.inventory.defById($inv.items[_slotTaken].id).name : $inv.items[_slotTaken].id) : "">>
<<set _effects = []>>
<<if _def and _def.equipEffects and _def.equipEffects.length>><<set _effects = _effects.concat(_def.equipEffects)>><</if>>
<<if _def and _def.useEffects and _def.useEffects.length>><<set _effects = _effects.concat(_def.useEffects)>><</if>>
<<if !_effects.length and _def and _def.effects and _def.effects.length>><<set _effects = _effects.concat(_def.effects)>><</if>>
<div class="inv-details">
<div class="inv-details-main">
<div class="inv-details-kicker"><<print _type>></div>
<div class="inv-details-title"><<print _name>></div>
<<if _desc>>
<div class="inv-details-desc"><<print _desc>></div>
<</if>>
<div class="inv-details-meta">
<div><b>Type:</b> <<print _type>></div>
<div><b>Rarity:</b> <<print _rarity>></div>
<<if _stack or _qty > 1>>
<div><b>Stack:</b> x<<print _qty > 0 ? _qty : 1>></div>
<</if>>
<<if _slot>>
<div><b>Slot:</b> <<print _slotLabel>></div>
<</if>>
<<if _durMeta>>
<div><b>Durability:</b> <<print _durMeta.label>></div>
<</if>>
<<if _equipped>>
<div><b>Status:</b> Equipped</div>
<<elseif _slotTaken and _slotTaken is not $invSel>>
<div><b>Status:</b> Slot occupied</div>
<</if>>
</div>
<<if _durMeta and !_durMeta.indestructible>>
<div class="inv-details-durbar is-<<print _durMeta.tone>>"><span style="width: <<print _durMeta.pct100>>%"></span></div>
<</if>>
<<if _effects.length>>
<div class="inv-details-section-title">Effects</div>
<div class="inv-details-effects">
<<for _i = 0; _i < _effects.length; _i++>>
<<set _eff = _effects[_i]>>
<div class="inv-details-effect">
<<if _eff and _eff.label>><span class="inv-effect-label"><<print _eff.label>></span><</if>>
<<if _eff and _eff.text>><span class="inv-effect-text"><<print _eff.text>></span><</if>>
<<if _eff and _eff.durationTurns !== undefined and _eff.durationTurns !== null>>
<span class="inv-effect-meta"><<print Number(_eff.durationTurns)>>t</span>
<</if>>
</div>
<</for>>
</div>
<</if>>
</div>
<div class="inv-details-actions">
<<if _slot>>
<<if _equipped>>
<<button "Unequip">>
<<run setup.inventory.unequip(String($invSel))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<elseif !_slotTaken>>
<<button "Equip">>
<<run setup.inventory.equip(String($invSel))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<else>>
<span class="inv-disabled-tip" data-inv-tip="That slot is already occupied."><button class="macro-button inv-disabled" disabled>Equip</button></span>
<div class="inv-action-note"><<print _slotTakenName ? ("Occupied by " + _slotTakenName + ".") : "That slot is already occupied.">></div>
<</if>>
<<elseif _type is "Consumable">>
<<if _qty > 0>>
<<button "Use">>
<<run (setup.inventory && setup.inventory.useConsumable ? setup.inventory.useConsumable(String(_id), 1) : setup.inventory.consume(String(_id), 1))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<else>>
<button class="macro-button inv-disabled" disabled>Use</button>
<</if>>
<</if>>
</div>
</div>
<</if>>
<</if>>
<</widget>>
<<widget "invDebugGrant">>
<<invEnsure>>
<details class="inv-debug-drawer">
<summary>Dev</summary>
<div class="inv-debug-panel">
<<button "Grant test items">>
<<run setup.inventory.grantTest()>>
<<goto "Inventory">>
<</button>>
</div>
</details>
<</widget>>
/* ===== CRAFTING WIDGETS (reverted to fix6) ===== */
<<widget "craftEnsure">>
<<nobr>>
<<run setup.inventory && setup.inventory.ensureState ? setup.inventory.ensureState() : null>>
<<if $craft is undefined or $craft is null>>
<<set $craft = { sel: "" }>>
<</if>>
<<if $craft.sel is undefined or $craft.sel is null>>
<<set $craft.sel = "" >>
<</if>>
<<if $craft.filter is undefined or $craft.filter is null>>
<<set $craft.filter = "all" >>
<</if>>
<<run setup.crafting && setup.crafting.ensure ? setup.crafting.ensure() : null>>
<<run (function(){
try {
if (!State.variables.craft) State.variables.craft = { sel:"", filter:"all" };
if (setup.crafting && typeof setup.crafting.normalizeFilter === "function") {
State.variables.craft.filter = setup.crafting.normalizeFilter(State.variables.craft.filter);
} else {
State.variables.craft.filter = String(State.variables.craft.filter || "all");
}
} catch (e) {}
})();>>
<<set _ids = (setup.crafting && setup.crafting.listIdsFiltered)
? setup.crafting.listIdsFiltered($craft.filter)
: ((setup.crafting && setup.crafting.listIds) ? setup.crafting.listIds() : Object.keys((setup.crafting && setup.crafting.recipes) ? setup.crafting.recipes : {}))>>
<<if !_ids.length>>
<<set $craft.sel = "" >>
<<elseif (not $craft.sel or _ids.indexOf(String($craft.sel)) is -1)>>
<<set $craft.sel = String(_ids[0])>>
<</if>>
<</nobr>>
<</widget>>
<<widget "craftRecipeFilters">>
<<nobr>>
<<craftEnsure>>
<<set _cur = String($craft.filter || "all")>>
<div class="craft-category-bar" role="tablist" aria-label="Recipe category filters">
<<if _cur is "all">>
<div class="craft-category-slot active" data-filter="all">
<<button "<span class='craft-category-icon' aria-hidden='true'>◈</span><span class='craft-category-sr'>All recipes</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("all") : null>>
<</button>>
<span class="craft-category-tip">All recipes</span>
</div>
<<else>>
<div class="craft-category-slot" data-filter="all">
<<button "<span class='craft-category-icon' aria-hidden='true'>◈</span><span class='craft-category-sr'>All recipes</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("all") : null>>
<</button>>
<span class="craft-category-tip">All recipes</span>
</div>
<</if>>
<<if _cur is "equipment">>
<div class="craft-category-slot active" data-filter="equipment">
<<button "<span class='craft-category-icon' aria-hidden='true'>🪓</span><span class='craft-category-sr'>Gear</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("equipment") : null>>
<</button>>
<span class="craft-category-tip">Gear</span>
</div>
<<else>>
<div class="craft-category-slot" data-filter="equipment">
<<button "<span class='craft-category-icon' aria-hidden='true'>🪓</span><span class='craft-category-sr'>Gear</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("equipment") : null>>
<</button>>
<span class="craft-category-tip">Gear</span>
</div>
<</if>>
<<if _cur is "consumable">>
<div class="craft-category-slot active" data-filter="consumable">
<<button "<span class='craft-category-icon' aria-hidden='true'>🧪</span><span class='craft-category-sr'>Consumables</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("consumable") : null>>
<</button>>
<span class="craft-category-tip">Consumables</span>
</div>
<<else>>
<div class="craft-category-slot" data-filter="consumable">
<<button "<span class='craft-category-icon' aria-hidden='true'>🧪</span><span class='craft-category-sr'>Consumables</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("consumable") : null>>
<</button>>
<span class="craft-category-tip">Consumables</span>
</div>
<</if>>
<<if _cur is "material">>
<div class="craft-category-slot active" data-filter="material">
<<button "<span class='craft-category-icon' aria-hidden='true'>🪵</span><span class='craft-category-sr'>Materials</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("material") : null>>
<</button>>
<span class="craft-category-tip">Materials</span>
</div>
<<else>>
<div class="craft-category-slot" data-filter="material">
<<button "<span class='craft-category-icon' aria-hidden='true'>🪵</span><span class='craft-category-sr'>Materials</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("material") : null>>
<</button>>
<span class="craft-category-tip">Materials</span>
</div>
<</if>>
<<if _cur is "quest">>
<div class="craft-category-slot active" data-filter="quest">
<<button "<span class='craft-category-icon' aria-hidden='true'>❗</span><span class='craft-category-sr'>Quest items</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("quest") : null>>
<</button>>
<span class="craft-category-tip">Quest items</span>
</div>
<<else>>
<div class="craft-category-slot" data-filter="quest">
<<button "<span class='craft-category-icon' aria-hidden='true'>❗</span><span class='craft-category-sr'>Quest items</span>">>
<<run setup.openCraftFilter ? setup.openCraftFilter("quest") : null>>
<</button>>
<span class="craft-category-tip">Quest items</span>
</div>
<</if>>
</div>
<</nobr>>
<</widget>>
<<widget "craftRecipeList">>
<<nobr>>
<<craftEnsure>>
<<set _ids = (setup.crafting && setup.crafting.listIdsFiltered)
? setup.crafting.listIdsFiltered($craft.filter)
: setup.crafting.listIds()>>
<div class="craft-recipes">
<<if !_ids.length>>
<div class="craft-empty">— No recipes in this category —</div>
<<else>>
<<for _i = 0; _i < _ids.length; _i++>>
<<set _rid = String(_ids[_i])>>
<<set _r = setup.crafting.recipes[_rid]>>
<<if !_r>><<continue>><</if>>
<<set _name = _r.name ? String(_r.name) : _rid>>
<<set _outId = (_r.output && _r.output.id) ? String(_r.output.id) : _rid>>
<<set _rarity = (setup.inventory && setup.inventory.getItemRarityLabel) ? setup.inventory.getItemRarityLabel(_outId) : "Common">>
<<set _safeName = setup.escapeHtml ? setup.escapeHtml(_name) : _name>>
<<set _safeRarity = setup.escapeHtml ? setup.escapeHtml(_rarity) : _rarity>>
<<set _st = setup.crafting.status(_rid)>>
<<set _canCraft = _st && _st.canCraft>>
<<set _statusClass = _canCraft ? "available" : "blocked">>
<<set _statusText = _canCraft ? "Available" : "Unavailable">>
<<set _recipeLabel = '<span class="craft-recipe-name">' + _safeName + '</span><span class="craft-recipe-status ' + _statusClass + '">' + _statusText + '</span><span class="craft-recipe-rarity">' + _safeRarity + '</span>'>>
<<if String($craft.sel) is _rid>>
<div class="craft-recipe-row active">
<<capture _rid _recipeLabel>>
<<button _recipeLabel>>
<<run setup.openCraftRecipe(String(_rid))>>
<</button>>
<</capture>>
</div>
<<else>>
<div class="craft-recipe-row">
<<capture _rid _recipeLabel>>
<<button _recipeLabel>>
<<run setup.openCraftRecipe(String(_rid))>>
<</button>>
<</capture>>
</div>
<</if>>
<</for>>
<</if>>
</div>
<</nobr>>
<</widget>>
<<widget "craftDetailPanel">>
<<nobr>>
<<craftEnsure>>
<<set _rid = String($craft.sel)>>
<<set _r = setup.crafting.recipes[_rid]>>
<<if !_r>>
<div class="craft-empty-detail">Select a recipe on the left.</div>
<<else>>
<<set _st = setup.crafting.status(_rid)>>
<div class="craft-right-top">
<div class="craft-head-copy">
<div class="craft-head-kicker">Workbench</div>
<div class="craft-title"><<print _r.name>></div>
</div>
<div class="craft-detail-nav">
<<button "Return">><<goto "Hub_1">><</button>>
</div>
</div>
<div class="craft-req-grid">
<!-- ingredient boxes -->
<<for _j = 0; _j < _st.reqs.length; _j++>>
<<set _q = _st.reqs[_j]>>
<div class="craft-reqbox">
<div class="craft-req-title"><<print _q.label>></div>
<<if _q.ok>>
<div class="craft-req-amt ok">Amount: <<print _q.have>>/<<print _q.need>></div>
<<else>>
<div class="craft-req-amt bad">Amount: <<print _q.have>>/<<print _q.need>></div>
<</if>>
</div>
<</for>>
<!-- terrain box -->
<div class="craft-reqbox craft-terrain-box">
<div class="craft-req-title"><<if _st.terrain.type is "soft">>PREFERRED TERRAIN<<elseif _st.terrain.type is "hard">>REQUIRED TERRAIN<<else>>Terrain<</if>></div>
<<if _st.terrain.type is "soft">>
<<if _st.terrain.discountActive>>
<div class="craft-req-amt preferred-active"><<print _st.terrain.text>></div>
<<else>>
<div class="craft-req-amt preferred-normal"><<print _st.terrain.text>></div>
<</if>>
<<elseif _st.terrain.ok>>
<div class="craft-req-amt ok"><<print _st.terrain.text>></div>
<<else>>
<div class="craft-req-amt bad"><<print _st.terrain.text>></div>
<</if>>
<div class="craft-terrain-note"><<print _st.terrain.detail>></div>
</div>
</div>
<!-- Stat changes / effects preview -->
<<set _outId = (_r.output && _r.output.id) ? String(_r.output.id) : _rid>>
<<set _outDef = (setup.inventory && setup.inventory.db && _outId && setup.inventory.db[_outId]) ? setup.inventory.db[_outId] : null>>
<<set _iconSrc = (setup.inventory && setup.inventory.getItemIconSrc && _outId) ? setup.inventory.getItemIconSrc(_outId) : ((_outDef && _outDef.icon) ? String(_outDef.icon) : "")>>
<<set _typeLabel = (setup.inventory && setup.inventory.getItemTypeLabel && _outDef) ? setup.inventory.getItemTypeLabel(_outDef) : "Crafted Item">>
<<set _rarityLabel = (setup.inventory && setup.inventory.getItemRarityLabel && _outId) ? setup.inventory.getItemRarityLabel(_outId) : "Common">>
<<set _eff = []>>
<<if _r.effects && _r.effects.length>><<set _eff = _eff.concat(_r.effects)>><</if>>
<<if _outDef && _outDef.equipEffects && _outDef.equipEffects.length>><<set _eff = _eff.concat(_outDef.equipEffects)>><</if>>
<<if _outDef && _outDef.useEffects && _outDef.useEffects.length>><<set _eff = _eff.concat(_outDef.useEffects)>><</if>>
<div class="craft-effectsbox">
<div class="craft-effects-head">STAT CHANGES</div>
<<if _eff.length>>
<ul class="craft-effects-list">
<<for _k = 0; _k < _eff.length; _k++>>
<<set _e = _eff[_k]>>
<<set _lab = (_e && _e.label) ? String(_e.label) : "Effect">>
<<set _txt = (_e && _e.text) ? String(_e.text) : "">>
<<set _dur = (_e && _e.durationTurns) ? (" (" + _e.durationTurns + " turn" + (_e.durationTurns !== 1 ? "s" : "") + ")") : "">>
<li><b><<print _lab>>:</b> <<print _txt>><<print _dur>></li>
<</for>>
</ul>
<<else>>
<div class="craft-effects-none">—</div>
<</if>>
</div>
<div class="craft-descbox">
<<if _r.desc>>
<<print _r.desc>>
<<else>>
(No description.)
<</if>>
<<if $craftCrafterNote>>
<div class="craft-crafter-note"><<print $craftCrafterNote>></div>
<</if>>
</div>
<div class="craft-showcase">
<div class="craft-showcase-head">ITEM SHOWCASE</div>
<div class="craft-showcase-frame">
<<if _iconSrc>>
<<set _iconAlt = setup.escapeHtml ? setup.escapeHtml(String(_r.name || "")) : String(_r.name || "")>>
<<print '<img class="craft-showcase-image" src="' + _iconSrc + '" alt="' + _iconAlt + '">'>>
<<else>>
<div class="craft-showcase-empty">No image available.</div>
<</if>>
</div>
<div class="craft-showcase-meta">
<div class="craft-showcase-name"><<print _r.name>></div>
<div class="craft-showcase-type"><<print _typeLabel>></div>
<div class="craft-showcase-rarity"><<print _rarityLabel>></div>
</div>
</div>
<div class="craft-actions">
<span class="craft-act craft-act-craft">
<<if _st.canCraft>>
<<button "Craft">>
<<run setup.crafting.craft(String($craft.sel)); setup.openCraftRefresh({ animate: false });>>
<</button>>
<<else>>
<button disabled>Craft</button>
<</if>>
</span>
</div>
<</if>>
<</nobr>>
<</widget>>
/* ======================================================
CHARACTER UI — POWERS HEADER (Limit label)
====================================================== */
<<widget "powerPanelHeader">>
<div class="char-panel-head">
<h2 class="char-panel-title">POWERS</h2>
<<powerLimitLabel>>
</div>
<</widget>>